检测被主机 mfc 加速器吞噬的 WinForm 中的键盘快捷键

Posted

技术标签:

【中文标题】检测被主机 mfc 加速器吞噬的 WinForm 中的键盘快捷键【英文标题】:Detecting keyboard shortcuts in WinForm swallowed by host mfc accelerators 【发布时间】: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快捷键 【参考方案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 作为所有者传递。 现在一切正常。

【讨论】:

以上是关于检测被主机 mfc 加速器吞噬的 WinForm 中的键盘快捷键的主要内容,如果未能解决你的问题,请参考以下文章

想做个WinForm程序,在点击一下按钮就实现打开另外一个已有的应用程序,以及检测主机的IP和MAC

检测 MFC 控件是不是没有足够的宽度来容纳文本(并且文本将被截断)

C++/CLI:将 MFC 嵌入 WinForm

MFC和Winform及WPF哪个更专业

对界面编程来说c++的mfc,qt和c#的winform,wpf哪个应用多?学哪个好?

C++ MFC 键盘加速器