C# 从低级鼠标挂钩C返回错误的鼠标坐标#

C# 从低级鼠标挂钩C返回错误的鼠标坐标#,c#,wpf,mouseevent,winforms-interop,mouse-hook,C#,Wpf,Mouseevent,Winforms Interop,Mouse Hook,我正在构建一个WPF应用程序,使用一些黑客技术将表单元素嵌入到同一渲染层上。基本上,我所做的是在屏幕外渲染表单,并在WPF图像中创建表单的模型。我还有一个低级的鼠标钩子,它从WPF应用程序中窃取事件(如果事件的目的地是表单模型),并使用PostMessage(…)将事件发送到隐藏的表单元素 如果我从钩子过程返回一个非零值,表示要吃掉事件(即使我仍然调用队列中的所有鼠标钩子),光标将卡在一个位置。我假设这是因为光标位置在某种WPF应用程序层中得到处理,而事件没有到达该层 我认为完全可以阻止WPF应

我正在构建一个WPF应用程序,使用一些黑客技术将表单元素嵌入到同一渲染层上。基本上,我所做的是在屏幕外渲染表单,并在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(…)中,我打印出正确的光标位置,后跟鼠标挂钩拉取的坐标,输出总是如下所示:

光标:523578

{X=1985777551,Y=1985777602}//此坐标从未更改

这一结果显然是错误的。如何从鼠标挂钩获取正确的鼠标坐标

多谢各位


另外,此解决方案源自一个流行的在线解决方案。不幸的是,该解决方案无法满足我的需要,因此我不得不将其更改为此表单。

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

作为旁注,您必须添加对System.Windows.Forms的引用,因为这是一个WPF应用程序。似乎我将内容编组到了错误的结构。显然,MOUSEHOOKSTRUCT\u LL是不正确的,但以下是正确的。。。[StructLayout(LayoutKind.Sequential)]私有结构MSLLHOOKSTRUCT{public POINT pt;public uint mouseData;public uint标志;public uint time;public IntPtr dwExtraInfo;}耶,System.Windows.Forms.Control.MousePosition无法工作,因为我的级别太低,以至于在允许光标移动之前,我截取并吃掉了鼠标移动事件。虽然它还不能让我回答我自己的问题,但事实证明我只是使用了一个名称相似但不正确的结构来检索数据。明白了,没问题!我只是尝试先使用简单的内置解决方案,然后再使用其他框架或原始win32。