C#: 当左/右鼠标键被按下时,如何获取鼠标坐标?

3

当左/右鼠标键被按下时,我如何获取鼠标的坐标?

我正在使用低级别的鼠标钩子,并能够获取光标的当前位置,但我想在任何鼠标按钮被按下时检索位置。

我该怎么做?

6个回答

3
为什么不直接捕获MouseDown事件,然后使用MouseEventArgs通过MouseEventArgs.Location获取点击位置?

OP的上下文不清楚。如果它是在Forms应用程序的上下文中,那么Ngu的解决方案是迄今为止最简单的。在此上下文之外,它根本不起作用 :) - Jeff Kotula

0
在你的MouseHook方法中:
public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
    //Marshall the data from the callback.
    MouseHookStruct MyMouseHookStruct = 
         (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));

    if (nCode >= 0)
    {
        int xcoord = MyMouseHookStruct.pt.x;
        int ycoord = MyMouseHookStruct.pt.y;
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam); 
}

这里


是的,这就是我正在使用的钩子。不过,你的答案在任何鼠标按钮被按下时都不会给我坐标。它只会给我鼠标的当前坐标,并且你忘记了返回语句。还是谢谢! - Zolomon
那么,你现在基本上可以自己接着做了吧? - Hans Passant
不好意思,我仍然无法使用user32.dll中的GetMessagePos()函数检索坐标,也不知道如何在过程中使用它。如果能得到帮助就太好了。 :) - Zolomon

0

在 WM_LBUTTONDOWN 上调用 GetMessagePos() 以获取所需内容。但我怀疑它是否能在低级鼠标钩子内正常工作。它应该在消息泵或窗口过程中使用。

"GetMessagePos 函数检索由 GetMessage 函数检索的最后一条消息的光标位置。"

您确定需要一个钩子吗?


是的,我需要一个钩子。谢谢!我会查看GetMessagePos()函数。 - Zolomon
如果您需要低级别的钩子,那么您不应该编写托管代码。鼠标的响应速度很重要 - 缓慢的鼠标会使一切变得更加困难。 - John Knoeller
嗯,我不会C++,所以我不能自己编写DLL,而且这只是为个人使用。将鼠标按钮点击的坐标写入文件是否会对性能造成太大影响呢? - Zolomon
个人使用?随你便。我想你会注意到它的缓慢 - 如果它让你太烦恼,你可以尝试使用C++。一个基本的dll并不是很难 - 特别是如果你使用VisualStudio。 - John Knoeller
卡顿不是由于点击,而是因为每个鼠标事件(主要是鼠标移动)都必须从内核所在的非托管代码转到托管代码来调用您的钩子函数。 - John Knoeller
好的,谢谢!如果我能让GetMessagePos()起作用,稍后我会尝试一下。我如何在WM_LBUTTONDOWN上使用GetMessagePos()? - Zolomon

0

0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接