2013-07-24 3 views
0

클래스를 만드는 폼이 있습니다. 이 클래스는 폼에서 실행되는 이벤트를 처리합니다. 문제는 KeyDown 이벤트를 사용하려고하지만 폼에 단추가 있고 KeyDown을 캡처하기 때문에 작동하지 않습니다. 다른 게시물에 대한 해결책은 ProcessCmdKey를 재정의하는 것이 었습니다. 문제는 다른 클래스 내부에서 메서드를 재정의하는 방법을 모르겠다는 것입니다. 아무도 내 다른 클래스 내부에서 모든 KeyDown 이벤트를 캡처 할 수있는 방법을 말해 줄 수 있습니까?다른 클래스의 KeyDown을 무시합니다. C#

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == Keys.Left) 
    { 
     MoveLeft(); DrawGame(); DoWhatever(); 
     return true; //for the active control to see the keypress, return false 
    } 
    else if (keyData == Keys.Right) 
    { 
     MoveRight(); DrawGame(); DoWhatever(); 
     return true; //for the active control to see the keypress, return false 
    } 
    else if (keyData == Keys.Up) 
    { 
     MoveUp(); DrawGame(); DoWhatever(); 
     return true; //for the active control to see the keypress, return false 
    } 
    else if (keyData == Keys.Down) 
    { 
     MoveDown(); DrawGame(); DoWhatever(); 
     return true; //for the active control to see the keypress, return false 
    } 
    else 
     return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

"다른 클래스의 오버라이드 ..."는 의미가 없습니다. 맞습니까? –

답변

0

포함하는 양식에 Button에서 KeyDown를 노출하는 것이 작업을 수행하는 가장 쉬운 방법.

class MyForm : Form { 
    Button m_button; 

    public event KeyEventHandler ButtonKeyDown; 

    public MyForm() { 
    m_button = ...; 
    m_button.KeyDown += delegate (object, e) { 
     KeyEventHandler saved = ButtonKeyDown; 
     if (saved != null) { 
     saved(object, e); 
     } 
    }; 
    } 
} 

이제 호출 코드 할 수있는 당신이 클래스와 이벤트를 배선하고 방법을 잘 모르겠지만,

+0

양식에 단 하나의 단추 이상이 있기 때문에 이것은 작동하지 않습니다. – Synaps3

+0

@ Synaps3 왜 같은 이벤트를 통해 모든 버튼을 프록시하지 않습니까? – JaredPar

0

MyForm::ButtonKeyDown 이벤트에 간단한 후크 폼의 KeyPreview 속성을 설정하면 사실, 그곳에서 이벤트를 개최 한 다음 이벤트를 처리하는 클래스에 이벤트를 전달할 수 있습니다. 따라서 버튼에 포커스가있는 경우에도 KeyDown은 양식에서 이벤트를 시작합니다.

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    ... Invoke your class 
} 
+0

KeyPreview 속성을 설정하면 작동합니다. 유일한 문제는 특정 키가 여전히 실행되지 않는다는 것입니다 (화살표 키, 탭). 모든 키에 대해이 작업을 수행하려면 어떻게해야합니까? – Synaps3

+0

난 여전히 화살표 키, 탭을 감지하는 데 도움이 필요해. – Synaps3

+0

[link] (http://stackoverflow.com/questions/1646998/up-down-left-and-right-arrow-keys-do-not-trigger-keydown-event)을 확인하십시오. 화살표 키를위한 해결책이 있습니다. . –

관련 문제