/// <inheritdoc cref="HookBase.LowLevelHook"/> protected override IntPtr LowLevelHook(int nCode, IntPtr wParam, IntPtr lParam) { bool prevented = false; RawMouseMessages state = (RawMouseMessages)wParam; if (Enum.IsDefined(typeof(RawMouseMessages), state)) { MouseState data = Marshal.PtrToStructure <MouseState>(lParam); prevented = Handle(state, data); } return(prevented ? (IntPtr)1 : User32.CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)); }
private bool Handle(RawMouseMessages state, MouseState data) { bool prevented = false; IPoint coords = new Point(data.Point.X, data.Point.Y); int delta = data.WheelDelta; DateTime time = data.DateTime; switch (state) { case RawMouseMessages.Move: { IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Movement, coords, delta, MouseButtons.None, KeyState.None, false, time); InvokeOnEvent(this, eventArgs); MouseMove?.Invoke(this, eventArgs); prevented = eventArgs.DefaultPrevented; break; } case RawMouseMessages.LeftDown: { bool isDoubleClick = (data.Time - LastLeftClick) <= User32.DoubleClickTime; Interlocked.Exchange(ref LastLeftClick, data.Time - (isDoubleClick ? User32.DoubleClickTime + 1 : 0)); IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Key, coords, delta, MouseButtons.Left, KeyState.Down, isDoubleClick, time); InvokeOnEvent(this, eventArgs); MouseDown?.Invoke(this, eventArgs); MouseClick?.Invoke(this, eventArgs); if (isDoubleClick) { MouseDoubleClick?.Invoke(this, eventArgs); } prevented = eventArgs.DefaultPrevented; break; } case RawMouseMessages.MiddleDown: case RawMouseMessages.RightDown: { MouseButtons button = state == RawMouseMessages.RightDown ? MouseButtons.Right : MouseButtons.Middle; IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Key, coords, delta, button, KeyState.Down, false, time); InvokeOnEvent(this, eventArgs); MouseDown?.Invoke(this, eventArgs); MouseClick?.Invoke(this, eventArgs); prevented = eventArgs.DefaultPrevented; break; } case RawMouseMessages.LeftUp: case RawMouseMessages.MiddleUp: case RawMouseMessages.RightUp: { MouseButtons button = state == RawMouseMessages.LeftUp ? MouseButtons.Left : state == RawMouseMessages.MiddleUp ? MouseButtons.Middle : MouseButtons.Right; IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Key, coords, delta, button, KeyState.Up, false, time); InvokeOnEvent(this, eventArgs); MouseUp?.Invoke(this, eventArgs); prevented = eventArgs.DefaultPrevented; break; } case RawMouseMessages.Wheel: { IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Wheel, coords, delta, MouseButtons.Wheel, delta > 0 ? KeyState.Up : KeyState.Down, false, time); InvokeOnEvent(this, eventArgs); MouseWheel?.Invoke(this, eventArgs); prevented = eventArgs.DefaultPrevented; break; } case RawMouseMessages.HWheel: { IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.HorizontalWheel, coords, delta, MouseButtons.Wheel, delta > 0 ? KeyState.Up : KeyState.Down, false, time); InvokeOnEvent(this, eventArgs); MouseHorizontalWheel?.Invoke(this, eventArgs); prevented = eventArgs.DefaultPrevented; break; } default: break; } return(prevented); }