2009-06-19 7 views
11

私のフォームでKeyUpイベントをキャプチャする必要があります(「フルスクリーンモード」を切り替える)。私がやっていることは次のとおりです。子コントロールにフォーカスがあるときにフォーム上にKeyUpイベントをキャプチャします。

protected override void OnKeyUp(KeyEventArgs e) 
{ 
    base.OnKeyUp(e); 

    if (e.KeyCode == Keys.F12) this.ToggleFullScreen(); 
} 

private void ToggleFullScreen() 
{ 
    // Snazzy code goes here   
} 

フォームのコントロールにフォーカスがない限り、これはうまくいきます。その場合、私はイベントを一切受け取っていません(OnKeyDownも試しました - そこには運がありません)。

子コントロールからKeyUpイベントを処理することはできますが、フォーム上のコントロールは動的に生成され、多数の子コントロールが存在する可能性があります。

私は確かに再帰関数で行うことができる画面上のすべてのコントロールのイベントハンドラを生成せずにこれを行う方法はありますか?

答えて

12

フォームのKeyPreviewをtrueに設定すると、KeyUpイベントを代行受信できます。

this.KeyPreview = true; 
. 
. 
. 


private void button1_KeyUp(object sender, KeyEventArgs e) 
{ 
    Trace.WriteLine("button key up"); 
} 

private void Form1_KeyUp(object sender, KeyEventArgs e) 
{ 
    Trace.WriteLine("form key up"); 
    e.Handled = true; 
} 

それは、フォームのトレースラインをダンプアップキーを処理し、ボタンハンドラが呼び出され得ることはありませんよ。私のテストのアプリで

は、私はこのような何かをしました。もちろん、イベントを処理することはできません(e.Handled = trueではない)、ボタンハンドラも呼び出されます。

+0

短くて甘い。私はそれが好きです! – Joseph

+0

ちょうど私が必要なもの!完璧なおかげで! –

5

フォームでイベントをグローバルに処理しようとしましたか?

protected override bool ProcessCmdKey(ref Message msg, Keys e) 
{ 
    if (e.KeyCode == Keys.F12) 
    { 
     this.ToggleFullScreen(); 
     return true; //marks command as handled 
    } 

    return base.ProcessCmdKey(ref msg, e); // Resend To Base Function 
} 
+0

これも機能します。ありがとうございます。 –

関連する問題