应用程序的快捷键由子组件“吞噬”

时间:2010-08-05 21:52:19

标签: c# .net vb.net winforms keyboard-shortcuts

在我的主申请表格中,我有许多菜单和工具栏按钮功能,我已为其指定了快捷键,例如 F10 F11 F12 < / KBD>。除了某些控件具有焦点的实例(例如第三方网格控件)之外,快捷方式的效果很好。在这种情况下, F11 或其他快捷方式由该控件处理并吞下......它们永远不会进入主UI的事件处理程序。

我真的不想,也不能用第三方控件,修改每个控件(有几十个)来传递我的 F * 键。我想挂钩应用程序的消息泵,但这似乎是一个严重的解决方案。是否有更好,更聪明的方法来处理这种情况?

(这是一个.NET WinForms MDI(2.0)应用程序,它可以承载多种家庭旋转以及第三方组件。)

3 个答案:

答案 0 :(得分:2)

如何将Form的KeyPreview属性设置为True?您应该能够拦截您想要的密钥或让它们通过。

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx

如果这不起作用,您可以覆盖WndProc并直接处理消息,但这需要更多的努力。

答案 1 :(得分:0)

您是否尝试过在MDI Child表单级别按键?然后,您可以在一个位置将相关的F *键按下传递给MDI Parent。

答案 2 :(得分:0)

以下是我的尝试:

  • 覆盖Sub WndProc
  • 覆盖函数ProcessKeyPreview
  • IMessageFilter.PreFilterMessage

虽然任何一个都应该有,但这些都没有奏效。这是我的怀疑,违规的儿童控制做了类似的事情并没有发挥出色。它是一个旧的Win32 OCX,实际上可能正在做一些非常讨厌的事情,比如在操作系统级别挂钩消息。不确定。

无论如何,解决方法是使用 Alt + SomeOtherKey。无论出于何种原因,使用 Alt + D 而不是 F11 可以正确地进行消息处理和焦点/视图更改。

此解决方案是围绕第三方控件和真正的黑盒问题的黑客攻击。我希望我确切地知道发生了什么,但我不怀疑第三方控件有自己的钩子进入消息泵并拦截 F * -keys。