【问题标题】:Detecting keyboard shortcuts in WinForm swallowed by host mfc accelerators检测被主机 mfc 加速器吞噬的 WinForm 中的键盘快捷键
【发布时间】:2013-09-09 09:41:47
【问题描述】:

我有一个 MFC MDI 应用程序,它将 Ctrl-F 定义为键盘加速器。 这个应用程序承载一个 WinForm 对话框。我的问题是我想从这个子 WinForm 对话框中捕获 Ctrl-F,但 MFC 大型机似乎正在吞噬它。

  • 我可以在 WinForm 对话框中检测到其他键盘快捷键(如果它们未在快捷键表中定义)
  • 如果编辑对话框也是MFC,我想我也可以为这个对话框定义和加载一个加速器,然后使用ProcessMessageFilter
  • 在 WinForm 中,我尝试了覆盖 ProcessCmdKey 和监听 KeyDown 事件均无济于事

您认为有一种方法可以在 WinForm 子项中接收这些按键吗?

【问题讨论】:

  • 注册为加速键的组合键不会生成键盘消息。它们被TranslateAccelerator 翻译成WM_COMMAND/WM_SYSCOMMAND 并且不会进入DispatchMessage 调用。如果快捷键表中未列出,我不确定您可以检测到键盘快捷键的陈述。这听起来像是解决方案,但我想我错过了一些东西。
  • 我想在mfc主机和winform中都使用Ctr-F。
  • 即:我想把Ctrl-F作为加速器留在主机中,但是当WinForm对话框在前台时,它应该也可以捕获Ctrl-F快捷键

标签: winforms mfc accelerator


【解决方案1】:

我认为在 WinForm child 中定义自己的消息循环可能会起作用。 例如

    while(true) {
        Message m;
        GetMessage(out m);
        if (m.Msg == WM_QUIT) 
break;
        DispatchMessage(m);
      }

我猜当您在 WinForm 上键入 CTRL + F 时,消息将由主消息循环(即您的 MFC 大型机应用程序)检索,并且由于焦点位于 WinForm 上,因此它不会执行任何操作。如果您有自己的 WinForm 消息循环和加速键,那么它可能会起作用。

【讨论】:

    【解决方案2】:

    我找到了一个可行的解决方案。 显示c# WinForm时,使用重载

    Form.Show(IWin32Window owner)
    

    并将 MFC 主机 Hwnd 作为所有者传递。 现在一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多