public int HookProcedure(int nCode, IntPtr wParam, IntPtr lParam) { bool cancel = false; if (nCode >= 0 && (wParam == (IntPtr)User32.WindowMessage.WM_KEYDOWN || wParam == (IntPtr)User32.WindowMessage.WM_SYSKEYDOWN)) { Win32Api.KBDLLHOOKSTRUCT kb = (Win32Api.KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(Win32Api.KBDLLHOOKSTRUCT)); if ((kb.dwFlags & Win32Api.KBDLLHOOKSTRUCTF.LLKHF_INJECTED) == 0) { cancel = OnKeyDownEvent(kb); } } else if (nCode >= 0 && (wParam == (IntPtr)User32.WindowMessage.WM_KEYUP || wParam == (IntPtr)User32.WindowMessage.WM_SYSKEYUP)) { Win32Api.KBDLLHOOKSTRUCT kb = (Win32Api.KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(Win32Api.KBDLLHOOKSTRUCT)); if ((kb.dwFlags & Win32Api.KBDLLHOOKSTRUCTF.LLKHF_INJECTED) == 0) { cancel = OnKeyUpEvent(kb); } } if (cancel) { return((int)new IntPtr(1)); } else { return(User32.CallNextHookEx(hookId.DangerousGetHandle(), nCode, wParam, lParam)); } }
protected bool OnKeyUpEvent(Win32Api.KBDLLHOOKSTRUCT kb) { KeyHookEventArgs e = new(kb); KeyUpEvent?.Invoke(this, e); return(e.Cancel); }
public KeyHookEventArgs(Win32Api.KBDLLHOOKSTRUCT kb) { VkCode = (Keys)kb.wVk; ScanCode = kb.wScan; Flags = kb.dwFlags; IsLLKHF_EXTENDED = (Flags & Win32Api.KBDLLHOOKSTRUCTF.LLKHF_EXTENDED) != 0; Time = kb.time; }