Exemple #1
0
        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));
        }