моей цели
я хочу, чтобы перевести левый щелчок на правую кнопку мышиPInvokeStackImbalance - вызов неуправляемого кода из HookCallback
моего подхода
- я зарегистрировать крюк низкого уровня через SetWindowsHookEx (user32 .dll)
- фильтр левый-указатель мыши
- проверить, хочу ли я перевести конкретный щелчок
- в случае, если я действительно хочу
- не передать сообщение
- создать новый MouseClick через 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-call для себя работает, и обработка щелчков левой кнопкой тоже работает. я ненавижу, когда структура больше, чем сумма частей ...
damn am i stupid - я даже сказал, что обычно подпись неправильная ... но теперь мне интересно - я скопировал сиг из другого проекта (производственный код), и он работает там ... что происходит? – santa
P/Invoke несколько прощает неправильные подписи, хотя в вашем случае неверные данные, вероятно, будут переданы функции. Чтобы предупредить, что у вас неправильная подпись, помощник по отладке PInvokeStackImbalance запускается, если он активен. –