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

Winforms 检测WinForm中被主机mfc加速器吞没的键盘快捷键,winforms,mfc,accelerator,Winforms,Mfc,Accelerator,我有一个MFC MDI应用程序,它将Ctrl-F定义为键盘加速器。 此应用程序承载WinForm对话框。我的问题是,我想从这个WinForm子对话框中捕获Ctrl-F,但MFC主机似乎正在吞并它 如果加速器表中未定义其他快捷键,我可以在WinForm对话框中检测它们 如果编辑对话框也是MFC,我想我也可以为此对话框定义并加载加速器,然后使用ProcessMessageFilter 在WinForm中,我尝试过重写ProcessCmdKey和侦听KeyDown事件,但均无效 您认为有没有一种方

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

  • 如果加速器表中未定义其他快捷键,我可以在WinForm对话框中检测它们
  • 如果编辑对话框也是MFC,我想我也可以为此对话框定义并加载加速器,然后使用ProcessMessageFilter
  • 在WinForm中,我尝试过重写ProcessCmdKey和侦听KeyDown事件,但均无效

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

我认为在WinForm子级中定义您自己的消息循环可能有效。 e、 g


我猜当您在WinForm上键入CTRL+F时,消息将由主消息循环(即您的MFC大型机应用程序)检索,因为焦点是WinForm,所以它什么也不做。如果您有自己的WinForm消息循环和加速键,那么它可能会工作。

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

Form.Show(IWin32Window owner)
并以所有者身份传递MFC大型机Hwnd。
现在一切正常。

注册为加速器的组合键不会生成键盘消息。它们被转换为
WM_COMMAND
/
WM_SYSCOMMAND
,并且不会进入
DispatchMessage
调用。如果快捷键未列在加速器表中,我不知道如何理解您可以检测快捷键的说法。这听起来像是解决方案,但我想我遗漏了一些东西。我想在mfc大型机和winform中都使用Ctr-F。也就是说:我想在大型机中保留Ctr-F作为加速器,但当winform对话框位于前台时,它也应该能够捕获Ctr-F快捷键
Form.Show(IWin32Window owner)