private int LowLevelKeyboardProc(int nCode, Int32 wParam, IntPtr lParam) { KeyboardEvent?keyboardEvent; if (nCode >= 0 && (keyboardEvent = GetKeyboardEvent(lParam)) != null) { var vkCode = keyboardEvent.vkCode; switch (wParam) { case WM_KEYDOWN: case WM_SYSKEYDOWN: { var count = _eventDict.GetValueOrDefault(vkCode, 0) + 1; _eventDict[vkCode] = count; if (count == 1) { AddModifier(vkCode); KeyDown?.Invoke(keyboardEvent); } else { KeyType?.Invoke(keyboardEvent); } // 锁定Windows以后就收不到事件了 if (keyboardEvent.code == LOCK_SHORTCUT) { foreach (var(_vkCode, _) in _eventDict) { RemoveModifier(_vkCode); KeyUp?.Invoke(new KeyboardEvent(_vkCode, _modifiers)); } _eventDict.Clear(); } break; } case WM_KEYUP: case WM_SYSKEYUP: // 解锁Windows以后收到事件就丢弃掉 if (_eventDict.Count == 0) { _modifiers = 0; break; } RemoveModifier(vkCode); _eventDict.Remove(vkCode); KeyUp?.Invoke(keyboardEvent); break; } } // 如果返回1,则结束消息,这个消息到此为止,不再传递。 // 如果返回0或调用CallNextHookEx函数则消息出了这个钩子继续往下传递,也就是传给消息真正的接受者。 return(CallNextHookEx(_keyboardHookHandle, nCode, wParam, lParam)); }