私は小さなゲームを作成しています。ゲームは 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 コントロールは、矢印キーの押下をインターセプトし、、およびイベントが発生しないように、タブ オーダー内の次のコントロールまたは前のコントロールにフォーカスを移動しますKeyDown
。KeyUp
ただしKeyPress
、PreviewKeyDown
イベントは発生するため、次のように使用できます。
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;
}
それでも、焦点がかなり醜い形で動き回っています...