SimpleCoderによると、ボタンクラスのメンバーIsInputKey
を無効にする必要がありました。
public class ControlButton : Button
{
protected override bool IsInputKey(Keys keyData)
{
if (keyData == Keys.Up)
{
return true;
}
else if (keyData == Keys.Down)
{
return true;
}
else if (keyData == Keys.Left)
{
return true;
}
else if (keyData == Keys.Right)
{
return true;
}
else
{
return base.IsInputKey(keyData);
}
}
}
は、その後、私はそうのように、この新しいクラスを使用して(デザイナークラスで)私のボタンオブジェクトをインスタンス化するために必要な:
private ControlButton btnDown;
private ControlButton btnRight;
private ControlButton btnLeft;
private ControlButton btnUp;
this.btnDown = new ControlButton();
this.btnRight = new ControlButton();
this.btnUp = new ControlButton();
this.btnLeft = new ControlButton();
次私はそうのような新しいボタンオブジェクトごとにOnClick
ハンドラを登録しました:
this.btnUp.Click += new System.EventHandler(this.btnUp_Click);
private void btnUp_Click(object sender, EventArgs e)
{
MessageBox.Show("Up");
}
(など)
とを登録メインフォームのハンドラ:
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.frmUavController_KeyDown);
private void frmUavController_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == Keys.Up) || (e.KeyCode == Keys.W))
{
btnUp.PerformClick();
}
else if ((e.KeyCode == Keys.Down) || (e.KeyCode == Keys.S))
{
btnDown.PerformClick();
}
else if ((e.KeyCode == Keys.Left) || (e.KeyCode == Keys.A))
{
btnLeft.PerformClick();
}
else if ((e.KeyCode == Keys.Right) || (e.KeyCode == Keys.D))
{
btnRight.PerformClick();
}
}
はtrueにメインフォームのプロパティKeyPreview
を設定し、私はもはや上下左右キー、ボタンコントロールのデフォルトの動作をオーバーライドしなかったかのように見えましたサイクルフォーカスを使用するのではなく、trueを返し、コントロールをメインフォームに戻します。ここから、後続のキー(上、下、左または右)を押すと、フォームは適切なハンドラを処理します。
このようなものにはswitch文を使用してください。それは私の目を傷つける。 –