【问题标题】:Erroneous Mouse Coordinates Returned from Low Level Mouse Hook C#从低级鼠标钩 C# 返回的错误鼠标坐标
【发布时间】:2011-11-03 16:03:59
【问题描述】:

我正在构建一个 WPF 应用程序,其中涉及一些将表单元素嵌入同一渲染层的黑客行为。基本上我所做的是在屏幕外渲染表单并在 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} //这个坐标永远不会改变

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

谢谢。

附:这个解决方案来源于一个流行的在线解决方案。不幸的是,该解决方案无法满足我的需求,因此我不得不将其更改为这种形式。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 顺便说一句,您必须添加对 System.Windows.Forms 的引用,因为这是一个 WPF 应用程序。
    • 看来我把东西编组到了错误的结构。显然 MOUSEHOOKSTRUCT_LL 不正确,但以下是正确的... [StructLayout(LayoutKind.Sequential)] private struct MSLLHOOKSTRUCT { public POINT pt;公共单位鼠标数据;公共单位标志;公共单位时间;公共 IntPtr dwExtraInfo; }
    • 是的,System.Windows.Forms.Control.MousePosition 不起作用,因为我的级别太低了,以至于我在允许光标移动之前拦截并吃掉了鼠标移动事件。虽然它还不能让我回答我自己的问题,但事实证明我只是使用了一个名称相似但不正确的结构来检索数据。
    • 知道了,没问题!我只是先尝试​​简单的内置解决方案,然后再使用其他框架或原始 win32。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2013-04-30
    相关资源
    最近更新 更多