private int MouseHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
MouseHookStruct mouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
MouseButtons button = MouseButtons.None;
short mouseDelta = 0;
int clickCount = 0;
bool mouseDown = false;
bool mouseUp = false;
switch (wParam)
{
case (int)WindowsMessage.WM_LBUTTONDOWN:
mouseDown = true;
button = MouseButtons.Left;
clickCount = 1;
break;
case (int)WindowsMessage.WM_LBUTTONUP:
mouseUp = true;
button = MouseButtons.Left;
clickCount = 1;
break;
case (int)WindowsMessage.WM_LBUTTONDBLCLK:
button = MouseButtons.Left;
clickCount = 2;
break;
case (int)WindowsMessage.WM_RBUTTONDOWN:
mouseDown = true;
button = MouseButtons.Right;
clickCount = 1;
break;
case (int)WindowsMessage.WM_RBUTTONUP:
mouseUp = true;
button = MouseButtons.Right;
clickCount = 1;
break;
case (int)WindowsMessage.WM_RBUTTONDBLCLK:
button = MouseButtons.Right;
clickCount = 2;
break;
case (int)WindowsMessage.WM_MOUSEWHEEL:
mouseDelta = (short)((mouseHookStruct.MouseData >> 16) & 0xffff);
break;
}
MouseEventExtArgs e = new MouseEventExtArgs(
button,
clickCount,
mouseHookStruct.Point.X,
mouseHookStruct.Point.Y,
mouseDelta);
if (this.EventMouseUp != null && mouseUp)
this.EventMouseUp.Invoke(null, e);
if (this.EventMouseDown != null && mouseDown)
this.EventMouseDown.Invoke(null, e);
if (this.EventMouseClick != null && clickCount > 0)
this.EventMouseClick.Invoke(null, e);
if (this.EventMouseClickExt != null && clickCount > 0)
this.EventMouseClickExt.Invoke(null, e);
if (this.EventMouseDoubleClick != null && clickCount == 2)
this.EventMouseDoubleClick.Invoke(null, e);
if (this.EventMouseWheel != null && mouseDelta != 0)
this.EventMouseWheel.Invoke(null, e);
if ((this.EventMouseMove != null || this.EventMouseMoveExt != null) &&
(this.Old_X != mouseHookStruct.Point.X || this.Old_Y != mouseHookStruct.Point.Y))
{
this.Old_X = mouseHookStruct.Point.X;
this.Old_Y = mouseHookStruct.Point.Y;
if (EventMouseMove != null)
this.EventMouseMove.Invoke(null, e);
if (EventMouseMoveExt != null)
this.EventMouseMoveExt.Invoke(null, e);
}
if (e.Handled)
return -1;
}
return NativeMethods.CallNextHookEx(this.MouseHookHandle, nCode, wParam, lParam);
}