C#でカスタマイズされた仮想キーボードを構築しています。
重要な点は、現在フォーカスがあるウィンドウに特定のキー押下を送信することです。ただし、通常、仮想キーボードのキーは、押された後にフォーカスを取得します。
この目的には、ある種のWindowsAPIを使用する必要があると思います。もしそうなら、どれがそうでなければ、それを行う正しい方法は何ですか?
C#でカスタマイズされた仮想キーボードを構築しています。
重要な点は、現在フォーカスがあるウィンドウに特定のキー押下を送信することです。ただし、通常、仮想キーボードのキーは、押された後にフォーカスを取得します。
この目的には、ある種のWindowsAPIを使用する必要があると思います。もしそうなら、どれがそうでなければ、それを行う正しい方法は何ですか?
このトピックに関する優れたリソースは次のとおりです。http ://www.yortondotnet.com/2006/11/on-screen-keyboards.html
基本的に、フォームを作成し、ボタンの代わりにキーのラベルを使用します。正しいスタイルを設定するには、CreateParamsをオーバーライドする必要があります。また、WndProcをオーバーライドして、通常フォームにフォーカスを送信するメッセージを除外する必要があります。次に、クリックイベントをラベルに追加し、を使用SendKeys.Send(keyPressed);
して実際のキーストロークをフォーカスのあるウィンドウに送信します。
リンクからの関連コードは次のとおりです。
private const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle = createParams.ExStyle | WS_EX_NOACTIVATE;
return createParams;
}
}
private const int WM_MOUSEACTIVATE = 0x0021;
private const int MA_NOACTIVATE = 0x0003;
protected override void WndProc(ref Message m)
{
//If we're being activated because the mouse clicked on us...
if (m.Msg == WM_MOUSEACTIVATE)
{
//Then refuse to be activated, but allow the click event to pass through (don't use MA_NOACTIVATEEAT)
m.Result = (IntPtr)MA_NOACTIVATE;
}
else
base.WndProc(ref m);
}
カスタムペイントルーチンを使用してパネル(keyb)のパネル(キー用)を使用して、テキストを中央に描画しました。
クリックイベントはSendKeys.Send( "1");です。等..
これは10キーのコントロール用だったので、イベントの接続は非常に簡単でした。
ウィンドウメッセージを処理する必要はなく、うまく機能します。10キーでフォーカスの問題はなく、カーソルがある場所に入力が送信されます。単純。