2010-03-23 2 views
2

이 문제에 대한 간단한 테스트 응용 프로그램을 만들었습니다. 두 개의 winform에는 각각 버튼이 들어 있습니다. 첫 번째 양식의 단추는 클릭 할 때 다른 양식을 엽니 다. 또한 키 업 이벤트를 구독합니다. 두 번째 형태는 그 버튼을 "AcceptButton"로 우리가 1 초 동안 잠 클릭 된 이벤트를 설정하고 닫기 위해 사용되는 입력하면잘못된 제어를 위해 KeyUp이 처리되었습니다.

(슬립 수행 일부 처리를 시뮬레이트하는) 사실에 DialogResult를 설정했다

두 번째 양식이지나 가기 전에 키가 해제 되어도 두 번째 양식이 계속 표시되고 집중된 경우에도이 두 번째 양식의 첫 번째 양식에있는 단추의 KeyUp 이벤트가 트리거됩니다.

두 번째 양식에서 Enter 키 이외의 키를 누르면 첫 번째 양식의 단추에 대한 이벤트가 트리거되지 않습니다.

첫 번째 형태 :

public Form1() 
    { 
     InitializeComponent(); 
     buttonForm2.KeyUp += new KeyEventHandler(cntKeyUp); 
    } 

    void cntKeyUp(object sender, KeyEventArgs e) 
    { 
     MessageBox.Show(e.KeyCode.ToString()); 
    } 

    private void buttonForm2_Click(object sender, EventArgs e) 
    { 
     using (Form2 f = new Form2()) 
     { 
      f.ShowDialog(); 
     } 
    } 

두 번째 형태 :

private void button1_Click(object sender, EventArgs e) 
    { 
     Thread.Sleep(1000); 
     this.DialogResult = DialogResult.OK; 
    } 

는 사람이 이벤트가 비 활성 형태의 버튼에 대한 트리거 이유를 알고 있는가와 어떤 일이 이런 일이 발생을 중지 할 수 있습니다 ?

+0

KeyDown 처리기를 Form1에 추가하면 문제가 해결 된 다음 Keyup 이벤트는 KeyDown에 설정된 이벤트 ID와 일치하는 KeyValue를 확인한 다음 지워집니다. KeyUp 이벤트가 다른 대화 상자에 의해 트리거 된 경우 KeyDown 값이 설정되지 않으며 조치가 취해지지 않는다는 것을 알고 있습니다. SLaks에서 제안한 두 번째 형식의 호출은 작은 테스트 케이스에서는 잠재적 인 솔루션이지만 실제 응용 프로그램에서는 하나 이상의 대화 상자에서이 작업을 잊어 버리기가 너무 쉽습니다. – Mikael

답변

3

WM_KEYUP 메시지를 보내기 전에 차단 호출을하고 양식을 닫습니다.

메시지가 전송 될 때까지 두 번째 양식은 없어 지므로 현재 포커스가있는 컨트롤이 첫 번째 양식에 있습니다. 당신이 경우 cntKeyUp에서 확인할 수 있습니다

:

당신은 주위

0

방법 중 하나를합니다 (의 keyup 후) 다음 메시지 루프에서 폼을 숨기려면 두 번째 양식의 클릭 핸들러에서 BeginInvoke를 호출하여이 문제를 해결할 수 보낸 사람은 당신이 처리 할 것으로 기대하는 양식이며, 그렇지 않으면 무시합니다.

+0

발신자는 Form1의 버튼입니다. 즉, 듣고 싶습니다. 그래서 이것은 효과가 없습니다. – Mikael

관련 문제