使用 SlimDX.RawInput 要从 hWnd(控件/表单的句柄)实际获取光标,您需要从“user32.dll”中外部函数
- BOOL GetCursorPos(LPOINT lpPoint)
使用 System.Runtime.Interlop 和 System.Drawing.Point(除非您决定改为创建 POINT 结构)。
[DllImport("user32.dll",CallingConvention=CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.Bool)]
internal unsafe static extern bool GetCursorPos(Point* lpPoint);
这将为您提供光标在桌面屏幕上的实际位置接下来您将获取 lpPoint 地址并将其传递给 ScreenToClient(HWND hWnd, LPPOINT lpPoint),它也返回一个 BOOL。
[DllImport("user32.dll",CallingConvention=CallingConvention.StdCall,SetLastError=true)]
internal static extern int ScreenToClient(IntPtr hWnd, Point* p);
让我们像这样从中获取点:
public unsafe Point GetClientCurorPos(IntPtr hWnd, Point*p)
{
Point p = new Point();
if (GetCursorPos(&p))
{
ScreenToClient(hWnd, &p);
}
return p;
}
您可以根据需要使用 SlimDX.RawInput.Device.MouseInput 处理程序,或者您可以在覆盖 WndProc 时进行一些编码,这在您用来处理我们所有 WINAPI 程序员都习惯的消息和繁琐的写作中是首选用它。然而,你走得越低,你得到的控制就越多。就像我说的那样,您可以从处理程序的 MouseInputEventArgs 中获取所有信息,但鼠标位置除外。我发现最好通过 WndProc 回调检查已处理的消息。