2010-11-23 12 views
2

私はWinFormsを使用しています。メインフォームのKeyDownイベントのイベントハンドラを作成し、ボタンのClickイベントハンドラを呼び出しました。基本WinForm KeyDownイベント処理

呼び出されるClickイベントハンドラは、押された特定のキーに依存します。ユーザーがキーを使用するのではなくボタンをクリックした後でキーを使用しようとすると、キー(たとえば下矢印)がタブサイクルとして機能し、フォーム上の各ボタンコントロール間のフォーカスが変更されますKeydownハンドラ)。

アイデア?

答えて

1

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を返し、コントロールをメインフォームに戻します。ここから、後続のキー(上、下、左または右)を押すと、フォームは適切なハンドラを処理します。

+1

このようなものにはswitch文を使用してください。それは私の目を傷つける。 –

0

Control.GetNextControlを使用し、それが返すものに焦点を合わせます。

+0

私は彼がこの行動を防止しようとしていると思いますが、質問はかなり曖昧です。 –

+0

私はwulfgarproがボタンのフォーカスと矢印ボタンが押されたときにフォームのKeyDownを捕まえたいと思っています。 – TarasB

+0

はい私はその動作を防止しようとしています。申し訳ありませんが質問は曖昧です..私はそれを明確に説明することはできません。 – wulfgarpro

0

KeyPreviewプロパティを参照してください。 http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx

trueに設定します。

また、フォームのProcessKeyPreviewを上書きすることもできます。

+0

@upvoter:これはあなたのために機能しますか? .NETで私にとっては効果がありません4.いくつか追加のステップがありますか? –

+1

マニュアルを読んだ後、KeyPreviewはキーイベントのためのものです。タブ、矢印のためではない...混乱して申し訳ありません。 ProcessKeyPreviewをオーバーライドすると役立ちます。ここでいくつかのアイデアを見つけることができます - http://www.codeproject.com/KB/cs/ProcessKeyPreview.aspx?msg=2375387。 – TarasB

+0

私は現在、フォームのKeyPreviewプロパティをtrueに設定しています。ユーザーが定義されたキーを使用するのではなく、ボタンの1つをクリックすると、フォームはフォーカスを失い、KeyDownイベントはボタンに関連付けられます(これには現在フォーカスがあります)。したがって、フォームでボタンに使用するのと同じKeyDownイベントハンドラを作成しました。これは、フォーム上の他のボタンの間でフォーカスを切り替えるためのメカニズムとしての矢印キーの動作を停止しません。ボタンにフォーカスがあるときに矢印キーのデフォルトの動作を停止する方法が必要です。 – wulfgarpro

2

問題は、ボタンがクリックされたときにフォーカスがあるため、その後のキーの押下はフォーム自体ではなくボタンによって行われます。ボタンのクリックイベントハンドラでは、フォームにフォーカス:フォームは、キープレスイベントをリッスンしますので、そのように

this.Focus(); 

、フォーカスがフォームに復元されます。

編集

あなたが発見したとして、本当の問題は、矢印キーを入力キーとして扱われていないということです。これを修正するには、使用するコントロールを継承する新しいクラスを作成する必要があります。次に、IsInputKeyメソッドをオーバーライドして、矢印キーを入力キーとして扱います。このリンクを確認してください:http://bytes.com/topic/c-sharp/answers/517530-trapping-arrow-keys-usercontrol。この記事はまた役に立つ:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.isinputkey.aspx

関連する問題