моя цель
я хочу перевести левый клик в правый клик
мой подход
- я регистрирую низкоуровневый хук через SetWindowsHookEx (user32.dll)
- фильтр левого клика мыши
- проверить, хочу ли я перевести ЭТО конкретный клик
- на случай, если я действительно хочу
- не передавать сообщение
- создать новый щелчок мышью с помощью mouse_event (тоже user32.dll)
проблема
когда я делаю описанные вещи, вот так:
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
if(nCode >= 0 && MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam && doRight) {
doRight = false;
MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
mouse_event(/*right down + right up*/8 | 16, hookStruct.pt.x, hookStruct.pt.y, 0, 0);
return new IntPtr(1);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
вызов mouse_event завершается неудачно с PInvokeStackImbalance-Exception, о котором, я думаю, я должен заботиться.
DllImports
, поскольку обычно PInvokeStackImbalance возникает из-за некорректных сигнатур импорта, вот мои:
[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);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
появление
мой обычный подход к изоляции проблемы в этом случае терпит неудачу - так как вызов mouse_event для себя работает, и удаление левых щелчков тоже работает. я ненавижу, когда структура больше, чем сумма частей ...