2011-04-23 4 views
0

MDI 상위 폼이 있습니다. 사용자가 Enter 키를 누르면 응용 프로그램을 종료하고 싶습니다. 나는 형태 (버튼, 텍스트 상자 등)에 어떤 클릭 컨트롤이 없을 때 keydown 이벤트에서 잘못된 keyvalues가 전달됩니다.

private void MainForm_KeyDown(object sender, KeyEventArgs e) 
{ 

    if (e.KeyValue == (int)Keys.Enter) 
    { 
        Application.Exit(); 
    } 
} 

이 지금은 잘 작동

다음과 같이

가 나는를 keyDown 이벤트를 확인합니다. e.KeyValue에는 Enter 키 (13) 값이 (int)입니다. 하지만 MDI 폼에 버튼이나 텍스트 상자를 넣으면은의 keyvalue 즉 18을 가져옵니다. 왜 그렇게 되나요?

이제 Alt+Enter을 누르면 양식이 닫힙니다. 뿐만 아니라 당신은 조금 더 빨리 키 누름을 처리 할 필요가 사전

답변

2

에 키

감사를 입력합니다. 다음 코드는 당신을 위해 작동합니다 : 난이 일을 시도

protected override bool ProcessKeyPreview(ref System.Windows.Forms.Message m) 
    { 
     int _ENTER = 13; 
     int _KEYUP = 257; 
     if (m.Msg == _ENTER && (int)m.WParam == _KEYUP) 
     { 
      Application.Exit(); 
     } 
     return base.ProcessKeyPreview(ref m); 
    } 
+0

예, 완벽하게 작동했습니다. 방금 _KEYUP 및 _ENTER를 바꿔서 답을 편집했습니다. m.MSG는 _KEYUP을 제공하고 _ENTER는 제공하지 않기 때문입니다. – Marshal

+0

아직도 알고 싶습니다. 이유는 무엇입니까? 나는 그것을 몇 분 안에 대답으로 받아 들일 것이다. 나는 누군가가 내 '왜 그렇게'부분에 대답하기 위해 되돌아 간다면 나는 기다리고있다! – Marshal

+2

키는 현재 포커스가있는 컨트롤에 의해 처리됩니다. 그래서 "Enter"키를 누르면 포커스가있는 컨트롤이 먼저 키를 처리합니다. 추가 키 "Alt"를 사용하면 키를 처리하는 데 집중 컨트롤이 적용되지 않습니다. "Ctrl"+ "Enter"를 시도해 볼 수도 있습니다 - 또한 양식에 의해 처리되어야합니다. 특별한 Form.KeyPreview 속성이 있지만 대부분의 경우 부적절하게 작동합니다. 따라서 컨트롤 앞에있는 키를 처리하기 위해 폼의 ProcessKeyPreview 또는 ProcessDialogKey 메서드를 재정의해야합니다. –

0

사용 e.KeyCode and e.Modifiers;

+0

:'경우 (e.KeyCode == Keys.Enter && e.Modifiers == Keys.Alt)' '{' 'Application.Exit();' '}'그러나 여전히 작동하지 않습니다. – Marshal

관련 문제