如何跟踪鼠标X / Y位置并将其打印到标签?

我知道如何从MSDN上的示例修改游标位置。

我的问题是如何在鼠标移动时检查鼠标的位置,然后将X和Y位置打印到代表标签?

编辑:让我们说我想从我的整个屏幕跟踪我的鼠标位置。

编辑2:我的应用程序将在后台/最小化。

我已经在使用Mouse Hooks了:

namespace Program { public partial class MouseHook { [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo); private const int MOUSEEVENTF_LEFTDOWN = 0x02; private const int MOUSEEVENTF_LEFTUP = 0x04; private const int MOUSEEVENTF_RIGHTDOWN = 0x08; private const int MOUSEEVENTF_RIGHTUP = 0x10; public void DoMouseClick() { int X = Cursor.Position.X; int Y = Cursor.Position.Y; IntPtr newP = new IntPtr(Convert.ToInt64("0", 16)); mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, newP); } } } 

这是关于系统级鼠标事件处理调用(低级鼠标proc)的msdn文档。

以下是使用低级鼠标触发器更改滚动事件的示例。

在第二个链接的答案中,从这里使用WM_MOUSEMOVE而不是WM_MOUSEWHEEL。

有一点需要注意:当鼠标hover在具有提升权限的程序上时,此程序将继续捕获鼠标事件,此程序必须以提升的权限启动。

代码(未测试):

 using System; using System.Diagnostics; using System.Windows.Forms; using System.Runtime.InteropServices; namespace CatchMouseMove { class InterceptMouse { const int INPUT_MOUSE = 0; const int MOUSEEVENTF_WHEEL = 0x0800; const int WH_MOUSE_LL = 14; private static LowLevelMouseProc _proc = HookCallback; private static IntPtr _hookID = IntPtr.Zero; public static void Main() { _hookID = SetHook(_proc); if (_hookID == null) { MessageBox.Show("SetWindowsHookEx Failed"); return; } Application.Run(); UnhookWindowsHookEx(_hookID); } private static IntPtr SetHook(LowLevelMouseProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam); private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { int xPos = 0; int yPos = 0; if (nCode >= 0 && MouseMessages.WM_MOUSEMOVE == (MouseMessages)wParam) { xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam); //do stuff with xPos and yPos } return CallNextHookEx(_hookID, nCode, wParam, lParam); } private enum MouseMessages { WM_MOUSEMOVE = 0x0200 } [StructLayout(LayoutKind.Sequential)] private struct POINT { public int x; public int y; } [StructLayout(LayoutKind.Sequential)] private struct MSLLHOOKSTRUCT { public POINT pt; public int mouseData; public int flags; public int time; public IntPtr dwExtraInfo; } public struct INPUT { public int type; public MOUSEINPUT mi; } [StructLayout(LayoutKind.Sequential)] public struct MOUSEINPUT { public int dx; public int dy; public int mouseData; public uint dwFlags; public int time; public int dwExtraInfo; } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); } } 

您需要设置Windows挂钩才能实现此目的。 MSDN文章如何在Visual C#.NET中设置Windows挂钩显示如何设置鼠标挂钩。

我尝试了它,它捕获了整个表单上的鼠标,即使鼠标光标在控件上。

您可以使用MouseMove事件的EventArgs,因为它包含鼠标坐标。 从那里,您可以轻松地将标签的text属性设置为您将从e (MouseMove EventArgs)获取的X或Y坐标。

 private void Form_MouseMove(object sender, MouseEventArgs e) { // Update the mouse coordinates displayed in the textbox. myTextBox.Text = e.Location.ToString(); }