1

C#でカスタマイズされた仮想キーボードを構築しています。

重要な点は、現在フォーカスがあるウィンドウに特定のキー押下を送信することです。ただし、通常、仮想キーボードのキーは、押された後にフォーカスを取得します。

この目的には、ある種のWindowsAPIを使用する必要があると思います。もしそうなら、どれがそうでなければ、それを行う正しい方法は何ですか?

4

2 に答える 2

4

このトピックに関する優れたリソースは次のとおりです。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);
    }
于 2013-01-03T15:53:51.530 に答える
0

カスタムペイントルーチンを使用してパネル(keyb)のパネル(キー用)を使用して、テキストを中央に描画しました。

クリックイベントはSendKeys.Send( "1");です。等..

これは10キーのコントロール用だったので、イベントの接続は非常に簡単でした。

ウィンドウメッセージを処理する必要はなく、うまく機能します。10キーでフォーカスの問題はなく、カーソルがある場所に入力が送信されます。単純。

于 2013-04-30T19:03:06.643 に答える