static IntPtr HookProc(IntPtr hWnd, WM_EVENT msg, IntPtr wParam, IntPtr lParam)
{
IntPtr returnCode = CallWindowProc(prevWndProc, hWnd, msg, wParam, lParam);
switch (msg)
{
case WM_EVENT.GETDLGCODE:
returnCode = (IntPtr)(returnCode.ToInt32() | DLGC_WANTALLKEYS);
break;
case WM_EVENT.IME_SETCONTEXT:
if (wParam.ToInt32() == 1)
{
ImmAssociateContext(hWnd, hIMC);
}
break;
case WM_EVENT.INPUTLANGCHANGE:
ImmAssociateContext(hWnd, hIMC);
returnCode = (IntPtr)1;
break;
// Key Events
case WM_EVENT.KEY_DOWN:
KeyboardEventDispatcher.EventInput_KeyDown(null, (Keys)wParam);
break;
case WM_EVENT.KEY_UP:
KeyboardEventDispatcher.EventInput_KeyUp(null, (Keys)wParam);
break;
case WM_EVENT.KEY_CHAR:
KeyboardEventDispatcher.EventInput_CharEntered(null, (char)wParam, lParam.ToInt32());
break;
// Mouse Events
case WM_EVENT.MOUSE_MOVE:
if (OnMouseMotion != null)
{
OnMouseMotion(null, new MouseMotionEventArgs(lParam.ToInt64()));
}
break;
case WM_EVENT.MOUSE_LBUTTONDOWN:
if (OnMouseButton != null)
{
OnMouseButton(null, new MouseButtonEventArgs(lParam.ToInt64(), MouseButton.Left, ButtonState.Pressed));
}
break;
case WM_EVENT.MOUSE_LBUTTONUP:
if (OnMouseButton != null)
{
OnMouseButton(null, new MouseButtonEventArgs(lParam.ToInt64(), MouseButton.Left, ButtonState.Released));
}
break;
case WM_EVENT.MOUSE_MBUTTONDOWN:
if (OnMouseButton != null)
{
OnMouseButton(null, new MouseButtonEventArgs(lParam.ToInt64(), MouseButton.Middle, ButtonState.Pressed));
}
break;
case WM_EVENT.MOUSE_MBUTTONUP:
if (OnMouseButton != null)
{
OnMouseButton(null, new MouseButtonEventArgs(lParam.ToInt64(), MouseButton.Middle, ButtonState.Released));
}
break;
case WM_EVENT.MOUSE_RBUTTONDOWN:
if (OnMouseButton != null)
{
OnMouseButton(null, new MouseButtonEventArgs(lParam.ToInt64(), MouseButton.Right, ButtonState.Pressed));
}
break;
case WM_EVENT.MOUSE_RBUTTONUP:
if (OnMouseButton != null)
{
OnMouseButton(null, new MouseButtonEventArgs(lParam.ToInt64(), MouseButton.Right, ButtonState.Released));
}
break;
case WM_EVENT.MOUSE_WHEEL:
if (OnMouseWheel != null)
{
OnMouseWheel(null, new MouseWheelEventArgs(wParam.ToInt32()));
}
break;
}
return(returnCode);
}