我为这个问题做了一个简单的测试应用程序,两个winforms包含一个按钮。 单击时,第一个表单上的按钮将打开另一个表单。它还订阅了keyup事件。
第二种形式的按钮设置为“AcceptButton”,在Clicked事件中我们睡眠1s然后将DialogResult设置为true(睡眠模拟一些处理完成)
当使用enter来关闭第二个表单时,触发第一个表单上按钮的KeyUp事件,即使该键在第二个表单之前已经很好地释放,所以第二个表单仍然显示并聚焦。
如果在第二个表单中按下了任何其他键,则不会触发第一个表单上的按钮事件。
第一种形式:
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 :(得分:3)
在发送WM_KEYUP
消息之前,您正在进行阻止呼叫,然后关闭表单。
到发送消息时,第二种形式消失了,所以当前焦点控制在第一种形式上。
你可以通过在第二种形式的点击处理程序中调用BeginInvoke
来解决这个问题,只在下一个消息循环中隐藏表单(在KeyUp之后)
答案 1 :(得分:0)
单程:
您可以在cntKeyUp中验证发件人是否是您希望处理的表单,否则请忽略。