示例#1
0
 private static void SetStateVirtual(Key key, bool state)
 {
     if (key.IsStateless())
     {
         return;
     }
     if (state)
     {
         DownKeysVirtual.Add(key);
     }
     else
     {
         DownKeysVirtual.Remove(key);
     }
 }
示例#2
0
        public static bool IsDownVirtual(Key key)
        {
            if (key.IsModifierFlag())
            {
                if (key.IsShift())
                {
                    return(IsDownVirtual(Key.LShift) || IsDownVirtual(Key.RShift));
                }
                else if (key.IsCtrl())
                {
                    return(IsDownVirtual(Key.LCtrl) || IsDownVirtual(Key.RCtrl));
                }
                else if (key.IsAlt())
                {
                    return(IsDownVirtual(Key.LAlt) || IsDownVirtual(Key.RAlt));
                }
                else if (key.IsWin())
                {
                    return(IsDownVirtual(Key.LWin) || IsDownVirtual(Key.RWin));
                }
            }

            return(DownKeysVirtual.Contains(key));
        }
示例#3
0
        public static bool DeviceInput(IDeviceInput input)
        {
            // Mouse move is handled here to reduce performance impact due to its high frequency
            if (input.Key == Key.MouseMove)
            {
                if (input.Injected)
                {
                    return(false);
                }
                MoveEvent?.Invoke();
                LastMouseAction = Time.Now;
                return(IsLocked || IsMouseLocked || IsMouseMoveLocked);
            }

            if (input.Key.IsUnknown())
            {
                return(false);
            }
            var key = !StatelessNumpad || !input.Key.IsNumpad() ? input.Key : MapNumpad(input.Key);

            // Deal with injected input
            if (input.Injected && (!key.IsMedia() || (uint)input.ExtraInfo == pid))
            {
                if (!key.IsStateless())
                {
                    if (input.State)
                    {
                        DownKeysVirtual.Add(key);
                    }
                    else
                    {
                        DownKeysVirtual.Remove(key);
                    }
                }

                return(false);
            }

            // Record key state if it has changed (ignore auto-repeat presses)
            if (input.State != IsDown(key))
            {
                if (!key.IsStateless())
                {
                    SetState(key, input.State);
                }
                History.Push(new KeyState(key, input.State));
                GlobalIDs[key] = ++CurrentGlobalID;
            }

            // Invoke special key event subscriptions
            InputEvent?.Invoke(key, input.State);

            // Check lock state
            bool locked = IsLocked || IsAllKeysLocked || (key.IsMouse() ? IsMouseLocked : IsKeyboardLocked) || IsLockedKey(key);
            bool blocked;

            // Update idle info
            if (key.IsMouse())
            {
                LastMouseAction = Time.Now;
            }
            else
            {
                LastKeyboardAction = Time.Now;
            }

            // If hotkey is running tell it that the key has been released
            if (!input.State && HotkeyManager.CurrentHotkeys.ContainsKey(key))
            {
                blocked = HotkeyManager.KeyUp(key);
            }

            // Block key if locked
            else if (locked)
            {
                return(true);
            }

            // Hotkey for that key is already running
            else if (HotkeyManager.CurrentHotkeys.ContainsKey(key))
            {
                blocked = HotkeyManager.IsBlocked(key);
            }

            // Pass key event to hotkey manager
            else if (input.State)
            {
                blocked = HotkeyManager.KeyDown(key);
            }
            else
            {
                blocked = HotkeyManager.KeyUp(key);
            }

            if (!blocked)
            {
                SetStateVirtual(key, input.State);
            }
            return(blocked);
        }