从低级鼠标钩子c#返回错误的鼠标坐标

本文关键字:鼠标 错误 返回 坐标 | 更新日期: 2023-09-27 18:13:31

我正在构建一个WPF应用程序,其中涉及到在同一渲染层上嵌入Form元素的一些技巧。从本质上讲,我所做的就是在屏幕外呈现表单,并在WPF图像中创建表单的模型。我还有一个低级的鼠标钩子,它从WPF应用程序中窃取事件,如果它们是用于表单模型的,而不是使用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}//这个坐标永远不会改变

这个输出显然是错误的。我怎么做才能从鼠标钩子获得正确的鼠标坐标?

谢谢。

注:这个解决方案来源于一个网上流行的解决方案。不幸的是,这个解决方案不能满足我的需要,所以我不得不把它改成这个形式。

从低级鼠标钩子c#返回错误的鼠标坐标

静态属性System.Windows.Forms.Control.MousePosition不工作的原因是什么?