【问题标题】:Application's shortcut keys "swallowed" by child components应用的快捷键被子组件“吞噬”
【发布时间】:2010-08-05 21:52:19
【问题描述】:

在我的主应用程序表单中,我有许多菜单和工具栏按钮功能,我为其分配了快捷键,例如 F10F11F12。除了某些控件具有焦点的情况(例如第 3 方网格控件)之外,快捷方式效果很好。在这种情况下, F11 或其他快捷方式由该控件处理并被吞下......它们永远不会进入我的主 UI 的事件处理程序。

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

(这是一个 .NET WinForms MDI (2.0) 应用程序,它承载了多种自制组件和第 3 方组件。)

【问题讨论】:

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


    【解决方案1】:

    将表单的 KeyPreview 属性设置为 True 怎么样?您应该能够拦截您想要的密钥或让它们通过。

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

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

    【讨论】:

    • 我确实打开了 KeyPreview 来处理箭头键。我已经检查过了,由于某种原因,F* 键没有像其他键一样被困住。你有任何有用的 WndProc 或挂钩链接吗?我认为这可能是我目前唯一的选择。
    • 好的。我也尝试过 WndProc,但子控件仍在捕获按键。例如。当焦点设置在子第三方网格中时,主应用程序表单中的我的 WndProc 永远不会获得 WM_KEYUP。
    • Paul 您可能必须为您拥有的每个表单设置 KeyPreview 或 KeyDown(因为您有 MDI 应用程序)
    【解决方案2】:

    您是否尝试过在 MDI 子窗体级别捕捉按键?然后,您可以在一个地方将相关的 F* 按键传递给 MDI 父级。

    【讨论】:

    • 考虑到这一点(我的子表单都继承自基本表单),但许多子表单都承载了正在捕获输入的违规控件。
    【解决方案3】:

    这是我尝试过的:

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

    这些都不起作用,尽管任何一个都应该起作用。我怀疑有问题的子控件做了类似的事情并且表现不佳。它是一个旧的 Win32 OCX,实际上可能正在做一些非常讨厌的事情,例如在操作系统级别挂钩消息。没有把握。

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

    此解决方案是针对第 3 方控件和真正的黑盒问题的破解。我希望我确切地知道发生了什么,但我不知道,虽然我怀疑第 3 方控件在消息泵中有自己的钩子并且正在拦截 F*-keys。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 2014-11-18
      相关资源
      最近更新 更多