C# フォームの KeyDown イベントをキャプチャしようとする 質問する

C# フォームの KeyDown イベントをキャプチャしようとする 質問する

私は小さなゲームを作成しています。ゲームは Windows フォームのパネルに印刷されます。今、キーダウン イベントをキャプチャして、矢印キーが押されたかどうかを確認したいのですが、問題は、それをキャプチャできないように見えることです。

説明させてください。フォームには 4 つのボタンとさまざまな他のコントロールがあり、たとえばユーザーがボタンの 1 つを押すと (ゲーム イベントをトリガーするため)、ボタンにフォーカスが置かれ、矢印キーで動きをキャプチャすることはできません。

私は次のようなことを試しました

private void KeyDown(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Left)
        {
            game.MovePlayer(DonutWarsLibrary.GameObjects.Direction.E);
            game.DrawObjects(panel1.CreateGraphics());
        }
        else if (e.KeyCode == Keys.Right)
        {
            game.MovePlayer(DonutWarsLibrary.GameObjects.Direction.W);
            game.DrawObjects(panel1.CreateGraphics());
        }
        else if (e.KeyCode == Keys.Up)
        {
            game.MovePlayer(DonutWarsLibrary.GameObjects.Direction.N);
            game.DrawObjects(panel1.CreateGraphics());
        }
        else if (e.KeyCode == Keys.Down)
        {
            game.MovePlayer(DonutWarsLibrary.GameObjects.Direction.S);
            game.DrawObjects(panel1.CreateGraphics());
        }
    }

そしてフォームキーダウンイベントが押されたときにこれを使用しました

private void MainForm_KeyDown(object sender, KeyEventArgs e)
    {
        KeyDown(e);
    }

また、Windows フォームのボタンやその他のさまざまなコントロールに keydown を追加しましたが、応答が返ってきません。関数内にブレークポイントを設定して、関数が呼び出されているかどうかを確認しましたが、そのブレークポイントはトリガーされません。

何か案は?

最も最適なのは、(現在フォーカスされているコントロールに関係なく) 一般的な KeyDown イベントをトリガーし、KeyDown メソッドを呼び出すことです。

ベストアンサー1

設定しましたか?KeyPreviewフォームのプロパティを に設定しますかtrue? これにより、フォームは主要なイベントを「最初に確認」するようになります。

アップデート:にフォーカスがあるときにこれを適切に動作させるのは、Button少し難しいようです。Button コントロールは、矢印キーの押下をインターセプトし、、およびイベントが発生しないように、タブ オーダー内の次のコントロールまたは前のコントロールにフォーカスを移動しますKeyDownKeyUpただしKeyPressPreviewKeyDownイベントは発生するため、次のように使用できます。

private void Form_KeyDown(object sender, KeyEventArgs e)
{
    e.Handled = ProcessKeyDown(e.KeyCode);
}

// event handler for the PreViewKeyDown event for the buttons
private void ArrowButton_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    ProcessKeyDown(e.KeyCode);

}

private bool ProcessKeyDown(Keys keyCode)
{
    switch (keyCode)
    {
        case Keys.Up:
            {
                // act on up arrow
                return true;
            }
        case Keys.Down:
            {
                // act on down arrow
                return true;
            }
        case Keys.Left:
            {
                // act on left arrow
                return true;
            }
        case Keys.Right:
            {
                // act on right arrow
                return true;
            }
    }
    return false;
}

それでも、焦点がかなり醜い形で動き回っています...

おすすめ記事