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

时间:2011-11-03 16:03:59

标签: c# wpf mouseevent winforms-interop mouse-hook

我正在构建一个WPF应用程序,其中包含一些hackery,用于在同一个渲染层上嵌入Form元素。基本上我做的是我在屏幕外渲染表单并在WPF图像中模拟表单。我还有一个低级鼠标钩子,如果它们的目的地是Form模型,则会从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} //此坐标永远不会改变

这个输出显然是错误的。如何从鼠标钩子中获取正确的鼠标坐标?

谢谢。

P.S。该解决方案源于在线流行的解决方案。不幸的是,该解决方案无法满足我的需求,所以我不得不将其改为这种形式。

1 个答案:

答案 0 :(得分:0)

静态属性System.Windows.Forms.Control.MousePosition的任何原因都不起作用?