/// <summary> /// フック手続き /// </summary> /// <param name="hookCode"></param> /// <param name="msg"></param> /// <param name="hookStruct"></param> /// <returns></returns> private static IntPtr HookProcedure(int hookCode, uint msg, ref MSLHooKStruct hookStruct) { try { if (0 <= hookCode && GlobalHook_Mouse.hookEvent != null && !GlobalHook_Mouse.IsPaused) { var stroke = GlobalHook_Mouse.ConverManageStroke(msg, ref hookStruct); state.button = stroke.Item1; state.action = stroke.Item2; state.x = hookStruct.point.x; state.y = hookStruct.point.y; state.data = hookStruct.mouseData; state.flags = hookStruct.flags; state.time = hookStruct.time; state.extraInfo = hookStruct.extraInfo; GlobalHook_Mouse.hookEvent(ref state); if (GlobalHook_Mouse.isCancel) { GlobalHook_Mouse.isCancel = false; return(new IntPtr(1)); } } return(CallNextHookEx(GlobalHook_Mouse.hookProcedureHandle, hookCode, msg, ref hookStruct)); } catch (Exception ex) { Console.WriteLine(ex.Message); throw; } }
private static extern IntPtr CallNextHookEx(IntPtr hookHandle, int hookCode, uint msg, ref MSLHooKStruct mslHookStruct);
/// <summary> /// マウスの操作状況の取得 /// </summary> /// <param name="msg"></param> /// <param name="hookStruct"></param> /// <returns></returns> private static Tuple <MouseButton, MouseAction> ConverManageStroke(uint msg, ref MSLHooKStruct hookStruct) { MouseButton button; MouseAction action; switch (msg) { case WM_MOUSEMOVE: button = MouseButton.None; action = MouseAction.Move; break; case WM_LBUTTONDOWN: button = MouseButton.Left; action = MouseAction.Down; break; case WM_LBUTTONUP: button = MouseButton.Left; action = MouseAction.Up; break; case WM_RBUTTONDOWN: button = MouseButton.Right; action = MouseAction.Down; break; case WM_RBUTTONUP: button = MouseButton.Right; action = MouseAction.Up; break; case WM_MBUTTONDOWN: button = MouseButton.Middle; action = MouseAction.Down; break; case WM_MBUTTONUP: button = MouseButton.Middle; action = MouseAction.Up; break; case WM_MOUSEHWHEEL: action = MouseAction.None; if (0 < (hookStruct.mouseData >> 16 & 0xFFFF)) { button = MouseButton.WheelUp; } else { button = MouseButton.WheelDown; break; } break; case WM_XBUTTONDOWN: action = MouseAction.Down; switch (hookStruct.mouseData >> 16) { case 1: button = MouseButton.XButton1; break; case 2: button = MouseButton.XButton2; break; default: button = MouseButton.Unknown; break; } break; case WM_XBUTTONUP: action = MouseAction.Up; switch (hookStruct.mouseData >> 16) { case 1: button = MouseButton.XButton1; break; case 2: button = MouseButton.XButton2; break; default: button = MouseButton.Unknown; break; } break; default: action = MouseAction.None; button = MouseButton.Unknown; break; } return(new Tuple <MouseButton, MouseAction>(button, action)); }