Используйте 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.