在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 IKeyboardInputSinkIKeyboardInputSink ,然后调用适当的方法。

  • 基本上,如果你得到一个WM_KEYDOWN ,你应该调用TranslateAccelerator() ,或者如果你得到一个WM_CHAR你应该调用TranslateChar()IKeyboardInputSink的文档并不好,但它确实指定了哪些方法处理哪些消息。 如果处理消息,该方法将返回true ,所以您将知道是否需要在Win32端处理消息。

    链接地址: http://www.djcxy.com/p/25917.html

    上一篇: modal WPF dialog hosted in a Win32 app doesn't receive keyboard events

    下一篇: Redrawing Client Area with transparency