检测被主机 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 控件是不是没有足够的宽度来容纳文本(并且文本将被截断)