int ProcessKeyboardEvent(int code, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam) { bool cancel = false; if (code >= 0 && lParam.scanCode != 0) { KeyboardEvent ev = null; switch (wParam.ToInt32()) { case 0x0100: ev = OnKeyDown; break; // 0x0100 = WM_KEYDOWN case 0x0101: ev = OnKeyUp; break; // 0x0101 = WM_KEYUP case 0x0104: ev = OnSystemKeyDown; break; // 0x0104 = WM_SYSKEYDOWN case 0x0105: ev = OnSystemKeyUp; break; // 0x0105 = WM_SYSKEYUP } // if any handler returns true, input will be canceled. if (ev != null) { foreach (var d in ev.GetInvocationList()) { cancel |= (bool)d.DynamicInvoke((Keys)lParam.vkCode, lParam.scanCode, lParam.flags); } } } int result = CallNextHookEx(hHook, code, wParam, ref lParam); return((result != 0 || cancel) ? 1 : 0); }