首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ElementHost阻止鼠标事件

ElementHost阻止鼠标事件
EN

Stack Overflow用户
提问于 2015-10-08 21:37:47
回答 1查看 791关注 0票数 2

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

因此,我正在创建一个Visual 2015扩展,处理选项页。

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

WPF TextBox在窗口窗体中的ElementHost中不接受输入

解决方案的快速运行:

( A)在UserControl的加载事件上,我确实:

代码语言:javascript
复制
var s = HwndSource.FromVisual(this) as HwndSource;
s?.AddHook(ChildHwndSourceHook);

( B)在ChildHwndSourceHook()中,我所做的事情如下:

代码语言:javascript
复制
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上也不会改变。不过,非常偶尔也是,但是鼠标事件确实可以工作,并继续工作直到我移到另一个页面或关闭对话框。这是最奇怪的部分。

我已经尝试了所有的一切,并搜索了谷歌一整天,但我并没有更深入地理解为什么点击工作良好,但鼠标对事件似乎没有注册。

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

有人知道我怎样才能让鼠标对事件进行控制吗?非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-09 05:09:14

我发现使用创建者Viasfora使用的方法是成功的。您可以在GitHub回购上看到代码。特别是,看看TextObfuscationDialog以及它是如何托管的。我相信VS扩展文档可能有问题,因为我遇到了与您相同的问题。

编辑:

我已经创建了一个示例项目来证明这个方法确实有效(我现在正在我自己的两个扩展中使用它)。希望这些工作代码可以使您更容易在自己的项目中实现它。

您可以从我的OneDrive在这里下载源代码。

UIElementDialogPage 论MSDN说:

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

因此,虽然ElementHost不能在普通/WinForms DialogPage的消息循环中正确工作,但是UIElementDialogPage会。有许多类具有UIElement*或类似的前缀-它们将帮助将VS的遗留代码从Windows迁移到WPF。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33026380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档