【问题标题】:How to determine which control is eating my keyboard events如何确定哪个控件正在吃我的键盘事件
【发布时间】:2009-06-17 20:51:52
【问题描述】:

在我的 .Net 应用程序中,我一直遇到我希望接收键盘事件的特定表单/控件的问题,但实际上并没有收到它。我对此的调试并没有取得太大进展,例如在我的所有控件中设置断点,并查看谁吃了不应该有的键盘事件。一定有更好的方法 - 是否有工具可以帮助我跟踪键盘事件处理?

【问题讨论】:

  • KeyPress、KeyDown、PreviewKeyDown
  • 退出键是今天的问题
  • 您的表单上是否设置了取消按钮?这会吃掉转义键。
  • 尝试使用和不使用取消按钮。现在我只是把它连接到有问题的表单中的主控件,但我仍然想知道为什么表单没有收到 Escape,即使使用 PreviewKey。
  • 我没有直接回答你的问题,所以我将它作为评论发布;在我的情况下,它是一个不起作用的功能键,最终它是我的罗技键盘上愚蠢的“f-lock”键,一定是清洁女工按下的。

标签: .net winforms keyboard


【解决方案1】:

我要做的第一件事是检查“属性”窗口(或设计器文件)以确保事件处理程序确实与事件挂钩。

【讨论】:

  • 谢谢,但我不是一个菜鸟 =)
  • 很好听;你说的是穴居人,所以我认为我们从基础开始;o)
【解决方案2】:

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

【讨论】:

【解决方案3】:

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

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

e.Handled = true;

e.SuppressKeyPress = true;

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

【讨论】:

  • 即使您使用“属性”窗口附加事件处理程序,您也可以轻松共享事件处理程序。
猜你喜欢
  • 2010-11-23
  • 2012-01-21
  • 2015-08-03
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多