在Win32应用程序中托管的模态WPF对话框不会收到键盘事件
我有一个WPF对话框,我想在Win32应用程序中显示为非模态窗口。 调用window.Show()可以正确显示窗口,并且所有的鼠标事件都可以正确处理,但是所有的键盘事件都是由父Win32窗口处理的,所以即使用户已经将焦点放到了文本框中,任何输入的文本也会显示在父Win32窗口中启动!
  这似乎是WinForms / WPF互操作中的一个已知问题,并且在显示对话框之前通过调用ElementHost.EnableModelessKeyboardInterop进行修复。  这会导致将新的消息过滤器添加到WinForms消息循环中,以便可以拦截键盘事件并将其适当地路由到WPF对话框。 
  不幸的是,我的主机应用程序不是WinForms应用程序,所以我没有选择调用EnableModelessKeyboardInterop 。  有没有办法在Win32应用程序中做类似的事情? 
您可以转发键盘消息,但您需要自己完成这项工作。
基本思路如下:
  一旦你的WPF窗口被创建并显示出来,就得到它的HwndSource : 
 HwndSource source = HwndSource.FromVisual(wnd) as HwndSource; 
  在你的消息循环中,只要你得到键盘消息,将HwndSource IKeyboardInputSink为IKeyboardInputSink ,然后调用适当的方法。 
  基本上,如果你得到一个WM_KEYDOWN ,你应该调用TranslateAccelerator() ,或者如果你得到一个WM_CHAR你应该调用TranslateChar() 。  IKeyboardInputSink的文档并不好,但它确实指定了哪些方法处理哪些消息。  如果处理消息,该方法将返回true ,所以您将知道是否需要在Win32端处理消息。 
上一篇: modal WPF dialog hosted in a Win32 app doesn't receive keyboard events
