이 문제에 대한 간단한 테스트 응용 프로그램을 만들었습니다. 두 개의 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;
}
는 사람이 이벤트가 비 활성 형태의 버튼에 대한 트리거 이유를 알고 있는가와 어떤 일이 이런 일이 발생을 중지 할 수 있습니다 ?
KeyDown 처리기를 Form1에 추가하면 문제가 해결 된 다음 Keyup 이벤트는 KeyDown에 설정된 이벤트 ID와 일치하는 KeyValue를 확인한 다음 지워집니다. KeyUp 이벤트가 다른 대화 상자에 의해 트리거 된 경우 KeyDown 값이 설정되지 않으며 조치가 취해지지 않는다는 것을 알고 있습니다. SLaks에서 제안한 두 번째 형식의 호출은 작은 테스트 케이스에서는 잠재적 인 솔루션이지만 실제 응용 프로그램에서는 하나 이상의 대화 상자에서이 작업을 잊어 버리기가 너무 쉽습니다. – Mikael