私の目標
左クリックを右クリックに変換したい
私のアプローチ
- SetWindowsHookEx (user32.dll) を介して低レベルのフックを登録します
- マウスの左クリックをフィルタリングする
- その特定のクリックを翻訳するかどうかを確認します
- 私が本当にしたい場合に備えて
- メッセージを伝えないでください
- mouse_event を介して新しい mouseclick を作成します (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 が機能し、左クリックの破棄も機能するためです。構造が部分の総和よりも大きいのは嫌いです...