1

C# で Windows フォームに検索機能を実装しています。フォームで true に設定KeyPreviewし、 のイベント ハンドラーを追加して、 、 、 などKeyDownをキャッチできるようctrl+fescenterました。

私はこれらのキーを問題なくキャッチしており、テキスト ボックスを表示することはできますが、ボックスに入力することはできません。すべてのキーが移動しますがPortsTraceForm_KeyDown(...)、テキスト ボックスには到達しません。についてのmsdnページによると、KeyPreviewe.Handledをfalseに設定すると、イベントがフォーカスのあるビュー(テキストボックス)に渡されるはずですが、これは起こっていません。KeyDownテキスト ボックスのイベントを登録していないので、既定の動作を使用する必要があります。私は何かを逃しましたか?

KeyDown イベント:

    private void PortsTraceForm_KeyDown(object sender, KeyEventArgs e)
    {
        e.SuppressKeyPress = true;
        e.Handled = false;

        if (e.KeyData == (Keys.F | Keys.Control)) // ctrl+f
        {
            e.Handled = true;
            ShowSearchBar();
        }
        else if (e.KeyCode == Keys.Escape) // esc
        {
            e.Handled = true;
            HideSearchBar();
        }
        else if (e.KeyCode == Keys.Enter) // enter
        {
            if (searchPanel.Visible)
            {
                e.Handled = true;
                if (searchShouldClear)
                    SearchStart();
                else
                    SearchNext();
            }
        }
    }

検索バーを表示:

    private void ShowSearchBar()
    {
            FindBox.Visible = true;
            FindBox.Focus(); // focus on text box   
    }

検索バーを非表示:

    private void HideSearchBar()
    {
            this.Focus(); // focus on form
            FindBox.Visible = false;
    }
4

2 に答える 2

1

を呼び出していても、TextBox にフォーカスがない可能性がありますFocus()ドキュメントから:

Focus は、主にカスタム コントロールの作成者を対象とした低レベルのメソッドです。代わりに、アプリケーション プログラマは子コントロールに対して Select メソッドまたは ActiveControl プロパティを使用するか、フォームに対して Activate メソッドを使用する必要があります。

成功したかどうかの戻り値を確認できますがFocus()、過去にそのメソッドを使用して任意のコントロールにフォーカスを設定することはほとんどありませんでした。代わりに、ドキュメントで提案されている方法、つまり call を使用してみてくださいSelect()

編集:

気にしないでください(それでも有効なアドバイスですが)、私はあなたの問題を見ていると思います:

e.SuppressKeyPress = true

なぜあなたはこれをやっている?繰り返しますが、ドキュメントから:

[SuppressKeyPress] キー イベントを基になるコントロールに渡す必要があるかどうかを示す値を取得または設定します

したがって、TextBox がキー イベントを取得するのを意図的に妨げています。イベントを通過させたい場合は、そのプロパティを に設定しないでくださいfalse

于 2011-09-12T18:13:31.643 に答える
0

オーバーライド メソッドのこの例を試してください。

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        // your code here

        // this is message example
        MessageBox.Show(keyData.ToString());
        return base.ProcessCmdKey(ref msg, keyData);
    }

よろしく。

于 2011-09-12T19:31:44.923 に答える