gpt4 book ai didi

c# - 为什么 KeyPress 的消息框显示在 KeyDown 之前?

转载 作者:太空狗 更新时间:2023-10-29 21:33:10 26 4
gpt4 key购买 nike

在文本框中按下一个键,KeyDown 事件发生在 KeyPress 之前。

我使用计数和消息框来查看会发生什么。

以下是我的代码:

int Ncount = 0;
private void Textbox_KeyDown(object sender, KeyEventArgs e)
{
Ncount += 1;
MessageBox.Show("KeyDown's Ncount : " + Ncount.ToString());
}

private void Textbox_KeyPress(object sender, KeyPressEventArgs e)
{
Ncount += 1;
MessageBox.Show("KeyPress's Ncount : " + Ncount.ToString());
}

当按下一个键时,这将首先显示...

KeyPress's Ncount : 2

...接着是:

KeyDown's Ncount : 1

KeyDown 消息框(NCount 为 1)是否应该显示在 KeyPress 消息框(Ncount 为 2)之前?

最佳答案

简短版本:MessageBox.Show() 是臭名昭著的 Application.DoEvents披着羊皮的狼。绝对比 DoEvents 更温和,但它不能解决像这样的重入问题。如果要显示调试信息,请始终使用 .NET 中的 Debug 类。

更长的版本:要理解此行为,您首先必须知道一些事实:在您收到 KeyDown 事件时,操作系统已经生成了 KeyPress 通知。它耐心地坐在消息队列中,等待您的应用程序恢复调度程序循环。这将是您获得的下一个事件。除非您将 e.Handled 设置为 true,否则 Winforms 会查看消息队列并清除 KeyPress 通知,这样事件就不会触发。

下一个事实:为了让 MessageBox 成为模态,或者就此而言任何 ShowDialog() 调用,它需要自己运行一个调度程序循环。这确保基本的事情仍然发生,比如绘制窗口和 MessageBox 识别 OK 按钮点击和用户被 Ding 打耳光!当他单击除消息框以外的任何其他内容时。

也许您现在可以将这些点联系起来,MessageBox 中的调度程序循环将在队列中看到 KeyPress 通知。并使您的 KeyPress 事件处理程序运行。因此,您显示另一个消息框,它必然位于第一个消息框之上。

这里没有显着错误,副作用只是盒子的 Z 顺序不是您期望的那样。如果你设置 e.Handled = true 并期望它起作用,你会得到更多的戏剧性。它不会。它不能。它已经在您的 KeyDown 事件处理程序完成时处理。

对此没有简单的解决方法。但是,一个,不要使用它。始终使用 Debug 类来生成调试信息。 MessageBox 的副作用太多了。

关于c# - 为什么 KeyPress 的消息框显示在 KeyDown 之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32020470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com