ElementHost阻止鼠标事件

时间:2015-10-08 21:37:47

标签: wpf winforms mouseover visual-studio-extensions elementhost

注意:我正在尝试解决鼠标问题,而不是已经解决的键盘问题

所以我正在创建一个Visual Studio 2015扩展,处理选项页面。

我正在使用WPF,因此我使用ElementHost来托管UserControl。起初它没有接收键盘事件,所以我在以下位置实现了解决方案:

WPF TextBox not accepting Input when in ElementHost in Window Forms

快速解决问题:

A)在UserControl的Loaded事件中,我这样做:

var s = HwndSource.FromVisual(this) as HwndSource;
s?.AddHook(ChildHwndSourceHook);

B)在ChildHwndSourceHook()中,我做了类似的事情:

static IntPtr ChildHwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == WM_GETDLGCODE)
    {
        handled = true;
        return new IntPtr(DLGC_WANTCHARS | DLGC_WANTARROWS | DLGC_HASSETSEL | DLGC_WANTTAB);
    }
    return IntPtr.Zero;
}

但是,现在鼠标悬停在事件上似乎被忽略了,因为光标在文本框或网格分割器上移动时不会改变,甚至在我创建的新Windows上都没有。但是,非常偶然,鼠标事件确实有效,并且继续工作,直到我移动到另一个页面或关闭对话框。这是最奇怪的部分。

我已经尝试了所有的东西并且整天都在搜索Google,但我并不了解为什么点击工作正常,但鼠标悬停在事件上似乎没有注册。

我确实尝试了删除消息处理程序,然后打开一个Window,但似乎一旦添加了处理程序,删除它就不会解决任何问题。

有谁知道如何让鼠标悬停在我的控件上?非常感谢!

1 个答案:

答案 0 :(得分:1)

我使用创建者Viasfora使用的方法找到了成功。您可以在GitHub repo here上看到代码。特别是,请查看TextObfuscationDialog及其托管方式。我相信VS扩展文档可能有问题,因为我遇到了你遇到的同样问题。

编辑:

我已经创建了一个示例项目,以显示此方法是否正常工作(我现在在我自己的2个扩展中使用它)。希望这个有效的代码可以让您更轻松地在自己的项目中实现它。

您可以从我的OneDrive here下载源代码。

WPF Options Page

UIElementDialogPage on MSDN说:

  

提供Windows Presentation Foundation(WPF)的无缝托管   运行IsDialogMessage样式的本机对话框中的内容   消息循环。此类允许标签进出WPF子项   窗口句柄(HWND),并在WPF中启用键盘导航   孩子HWND。

因此,当ElementHost在普通/ WinForms DialogPage的消息循环中无法正常运行时,UIElementDialogPage会。有许多类具有UIElement*或类似的前缀 - 它们有助于将VS的遗留代码从Windows Forms迁移到WPF。