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

감사합니다. –

관련 문제