private static int KeyboardCallBack(int code, WinAPI.User32.WindowsMessage wParam, ref WinAPI.User32.KeyboardHookStruct lParam) { // Если code < 0, мы не должны обрабатывать это сообщение системы if (code >= 0) { var key = KeyInterop.KeyFromVirtualKey((int)lParam.VKCode); KeyEventArgsCustom eventArgs = new KeyEventArgsCustom(key); // В зависимости от типа пришедшего сообщения вызовем то или иное событие if (lParam.dwExtraInfo == IntPtr.Zero) { switch (wParam) { case WinAPI.User32.WindowsMessage.KeyDown: case WinAPI.User32.WindowsMessage.SysKeyDown: KeyDown?.Invoke(null, eventArgs); break; case WinAPI.User32.WindowsMessage.KeyUp: case WinAPI.User32.WindowsMessage.SysKeyUp: KeyUp?.Invoke(null, eventArgs); break; } } // Если событие помечено приложением как обработанное, // прервём дальнейшее распространение сообщения if (eventArgs.Handled) { return(1); } } // Вызовем следующий обработчик return(WinAPI.User32.CallNextHookEx(_keyboardHookHandle, code, wParam, ref lParam)); }
private static void KeysUp(object sender, KeyEventArgsCustom e) { var eventArgs = new PressedKeysEventArgs(PressedKeys, e.Key); PressedKeys.Remove(e.Key); KeyUp?.Invoke(null, eventArgs); if (eventArgs.Handled) { e.Handled = true; } }
private static void KeysDown(object sender, KeyEventArgsCustom e) { var eventArgs = new PressedKeysEventArgs(PressedKeys, e.Key); if (PressedKeys.Contains(e.Key)) { KeysHolding?.Invoke(null, eventArgs); if (eventArgs.Handled) { e.Handled = true; } return; } PressedKeys.Add(e.Key); KeyDown?.Invoke(null, eventArgs); if (eventArgs.Handled) { e.Handled = true; } }