internal override IntPtr Callback(int nCode, IntPtr wParam, IntPtr lParam) { var data = (KBDLLHOOKSTRUCT)PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT)); var ea = new LowLevelKeyboardProcEventArgs(data); LowLevelKeyboardProc?.Invoke((WPARAM)wParam, ea); switch ((WPARAM)wParam) { case WPARAM.WM_KEYDOWN: KeyDown?.Invoke(ea); break; case WPARAM.WM_KEYUP: KeyUp?.Invoke(ea); break; case WPARAM.WM_SYSKEYDOWN: SysKeyDown?.Invoke(ea); break; case WPARAM.WM_SYSKEYUP: SysKeyUp?.Invoke(ea); break; } return(base.Callback(nCode, wParam, lParam)); }