.net 如何确定哪个控件正在吃掉我的键盘事件

.net 如何确定哪个控件正在吃掉我的键盘事件,.net,winforms,keyboard,.net,Winforms,Keyboard,在我的.Net应用程序中,我不断遇到一个特定窗体/控件的问题,我希望收到一个键盘事件,但实际上没有收到它。我对这个问题的调试并没有超出穴居人的范围,例如在我所有的控件中设置断点,并查看谁吃了不应该吃的键盘事件。一定有更好的方法-是否有工具可以帮助我跟踪键盘事件处理?我要做的第一件事是检查属性窗口(或设计器文件)以确保事件处理程序确实连接到事件。通常表单将处理按键事件。没有工具,因为它只是监视堆栈跟踪。最好的办法是在表单的KeyPress事件中生成跟踪语句(添加断点并右键单击,转到“命中时”),然

在我的.Net应用程序中,我不断遇到一个特定窗体/控件的问题,我希望收到一个键盘事件,但实际上没有收到它。我对这个问题的调试并没有超出穴居人的范围,例如在我所有的控件中设置断点,并查看谁吃了不应该吃的键盘事件。一定有更好的方法-是否有工具可以帮助我跟踪键盘事件处理?

我要做的第一件事是检查属性窗口(或设计器文件)以确保事件处理程序确实连接到事件。

通常表单将处理按键事件。没有工具,因为它只是监视堆栈跟踪。最好的办法是在表单的KeyPress事件中生成跟踪语句(添加断点并右键单击,转到“命中时”),然后查看form.KeyEventArgs和sender对象中的信息

其他需要注意的重要事项:非字符键(包括向下翻页、向上翻页等)不会引发按键事件,它们只会引发向下翻页和向上翻页,如果您设置

e.Handled=true

e.SuppressKeyPress=true


我也不建议使用designer/properties窗口来连接事件,使用Addhandler(VB)或+=(C#),因为在更复杂的表单中,您将有许多控件共享事件处理程序的场景,并在运行时动态指定处理程序。

假设您使用的是完整版本的Visual Studio(不是快速版或任何其他版本)使用Spy++。启动Spy++时,找到应用程序根窗口(Spy++有一个方便的搜索>查找窗口菜单项以提供帮助)然后右键单击Windows树状视图中的根窗口并选择Messages(消息)。这会将您带到Messages(消息)窗格,该窗格将开始监视该窗口的所有消息。开始键入并检查WM_KEYDOWN(WM_KEYDOWN)等。如果您仍然看不到按键,请转到Messages options(消息选项)并选中“相同进程的窗口”。此时,您应该能够监视过程中的所有按键事件。右键单击WM_按键(或类似按钮)消息并转到属性。在属性中,应显示处理消息的窗口的句柄,单击该句柄将在Windows树视图中高亮显示该消息。现在,您只需右键单击高亮显示的窗口,然后选择“高亮显示”,以查看它在窗体上的控件。

KeyPress,KeyDown,PreviewKeydowne键是今天的问题你的表单上设置了CancelButton吗?这会吃掉escape键。使用和不使用CancelButton都进行了尝试。现在我只是将它连接到相关表单中的主控件,但我仍然想知道为什么表单没有接收escape,即使使用PreviewKey。我不回答你的问题所以我把它作为一条评论发布;在我的例子中,它是一个功能键不起作用,结果它是一个愚蠢的“f锁”我的Logitech键盘上的键,该键一定是被清洁工按下的。即使您使用“属性”窗口附加事件处理程序,您也可以轻松地共享事件处理程序。谢谢,但我不是一个很好的noob=)好听;你说的是穴居人,所以我认为我们从基础开始;o) 其他版本确实支持Spy++。请参阅: