注意:我正在尝试解决鼠标问题,而不是键盘问题,这个问题已经解决了。
因此,我正在创建一个Visual 2015扩展,处理选项页。
我使用的是WPF,所以我使用ElementHost来托管UserControl。起初,它没有接收键盘事件,所以我在以下位置实现了该解决方案:
WPF TextBox在窗口窗体中的ElementHost中不接受输入
解决方案的快速运行:
( A)在UserControl的加载事件上,我确实:
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上也不会改变。不过,非常偶尔也是,但是鼠标事件确实可以工作,并继续工作直到我移到另一个页面或关闭对话框。这是最奇怪的部分。
我已经尝试了所有的一切,并搜索了谷歌一整天,但我并没有更深入地理解为什么点击工作良好,但鼠标对事件似乎没有注册。
我确实尝试过删除消息处理程序,然后打开一个窗口,但是似乎一旦添加了处理程序,删除它就不会修复任何问题。
有人知道我怎样才能让鼠标对事件进行控制吗?非常感谢!
发布于 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。
https://stackoverflow.com/questions/33026380
复制相似问题