1. ホーム
  2. c#

[解決済み] フォームが KeyDown イベントに応答しない

2023-03-15 23:29:04

質問

Windows Forms プロジェクトでしばらく作業していたのですが、キーボードショートカットを試してみることにしました。少し読んだ後、私はイベント ハンドラを書いて、それをフォームの KeyDown イベントにバインドしなければならないと思いました。

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.Alt && e.KeyCode == Keys.O)
    {
        MessageBox.Show("Ctrl+Alt+O: magic!");
    }
}

Visual Studio デザイナーのプロパティパネルを開き、フォームの KeyDown イベントをダブルクリックして Form1_KeyDown イベントハンドラを生成しました。しかし、アプリケーションをテストしてみると、フォームが Ctrl + Alt + O というキーボードショートカットがあります。Visual Studio のデザイナーは、イベント ハンドラをフォームにバインドするコードを生成しましたが。

private void InitializeComponent()
{
    // ...

    this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);

    // ...
}

というわけで、試しに Console.WriteLine() をハンドラに追加して、ハンドラが呼び出されていることを確認しようとしましたが、これもうまくいきませんでした。

また、イベント バインディング呼び出し (すぐ上に表示) にブレークポイントを設定しようとしましたが、プログラムはそのブレークポイントにうまく到達することがわかりました。しかし、私がメソッド定義自体の中で設定したブレークポイントは、決して到達しません。

私が最初の数ステップを正しく行っていることを確認するために、私はそれらを繰り返してみました。

  • 同じソリューションの新しいフォームです。

    同じ問題:フォームが、私が私の Ctrl + Alt + O キーボードショートカットで、デバッガーはイベントハンドラにステップインさえしていません。 これをもう一度試したところ、うまくいきました。

  • 全く新しいWinFormsソリューションです。

    これは完全に動作します。メッセージダイアログが表示され ( Console.WriteLine() の呼び出しも機能します)。

というわけで、私はここでかなり迷っています。この 1 つのプロジェクトのすべてのフォームが KeyDown イベントを受け取るのを妨げているのは何でしょうか?

どのように解決すればよいのでしょうか。

フォームのKeyPreviewプロパティはtrueに設定されていますか?

Form.KeyPreviewプロパティ

フォーカスを持つコントロールにイベントが渡される前に、フォームがキーイベントを受信するかどうかを示す値を取得または設定します。 イベントがフォーカスを持つコントロールに渡される前に、フォームがキーイベントを受け取るかどうかを示す値を取得または設定します。

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx