我正在构建一个 WPF 应用程序,其中涉及一些骇客,以便在同一渲染层上嵌入 Form 元素。本质上,我所做的是将表单呈现在屏幕外,并在 WPF 图像中制作表单的模型。我还有一个低级鼠标钩子,如果 WPF 应用程序的事件注定要用于 Form 模型,则它会从它们中窃取事件,而是使用 PostMessage(...) 将事件发送到隐藏的表单元素。
如果我从我的钩子程序返回一个非零值,指示吃掉事件(即使我仍然调用队列中的所有鼠标钩子),光标会停留在一个位置。我假设这是因为光标位置在事件未到达的某种 WPF 应用程序层中得到处理。
我认为完全可以防止 WPF 应用程序知道该事件,因为我可以自己设置光标位置——毕竟有坐标附加到鼠标事件。不幸的是,这些鼠标坐标似乎非常不正确。事实上,无论我的光标在哪里,我总是收到相同的坐标。
这是我的代码:
if (nCode >= 0){
MOUSEHOOKSTRUCT_LL mousehookstruct_ll1 =
((MOUSEHOOKSTRUCT_LL)Marshal.PtrToStructure(((IntPtr)lParam), typeof(MOUSEHOOKSTRUCT_LL)));
if (mousehookstruct_ll1 != null) {
if ((user != null) && user.SystemMouseHookProc(nCode, wParam, lParam, new Point(mousehookstruct_ll1.pt_x, mousehookstruct_ll1.pt_y), mousehookstruct_ll1.dwExtraInfo)) {
return new IntPtr(1);// CallNextHookEx(this.MessageHookHandle, 1, wParam, lParam);// It doesn't matter that I don't call CallNextHook here.
}
}
}
GC.KeepAlive(this);
return CallNextHookEx(this.MessageHookHandle, nCode, wParam, lParam);
}
然后在 user.SystemMouseHookProc(...) 中,我打印出正确的光标位置,然后是鼠标钩子拉出的坐标,输出总是如下所示:
光标:523,578
{X=1985777551,Y=1985777602} //这个坐标永远不会改变
该输出显然是错误的。如何从鼠标钩中获取正确的鼠标坐标?
谢谢你。
PS这个解决方案来源于网上流行的一个。不幸的是,该解决方案无法满足我的需求,因此我不得不将其更改为这种形式。