diff --git a/Project-Aurora/Project-Aurora/Controls/Control_Keybind.xaml.cs b/Project-Aurora/Project-Aurora/Controls/Control_Keybind.xaml.cs index aa1dcb848..589ea28fe 100755 --- a/Project-Aurora/Project-Aurora/Controls/Control_Keybind.xaml.cs +++ b/Project-Aurora/Project-Aurora/Controls/Control_Keybind.xaml.cs @@ -101,6 +101,7 @@ private void Grid_KeyDown(object? sender, KeyEventArgs e) private async void Control_Keybind_OnLoaded(object sender, RoutedEventArgs e) { + (await InputsModule.InputEvents).KeyDown -= InputEventsKeyDown; (await InputsModule.InputEvents).KeyDown += InputEventsKeyDown; } diff --git a/Project-Aurora/Project-Aurora/Modules/Inputs/InputEvents.cs b/Project-Aurora/Project-Aurora/Modules/Inputs/InputEvents.cs index f319846a9..67a813ac4 100644 --- a/Project-Aurora/Project-Aurora/Modules/Inputs/InputEvents.cs +++ b/Project-Aurora/Project-Aurora/Modules/Inputs/InputEvents.cs @@ -100,6 +100,11 @@ private nint Hook(IntPtr hwnd, uint msg, IntPtr wparam, IntPtr lparam) /// if input should be interrupted or not private bool DeviceOnKeyboardInput(RawKeyboard keyboardData) { + if (HasNoListener()) + { + return false; + } + try { var flags = keyboardData.Flags; @@ -116,13 +121,9 @@ private bool DeviceOnKeyboardInput(RawKeyboard keyboardData) var down = (flags & RawKeyboardFlags.Up) == 0; SetModifierKeys(key, down); - if (down) - { - _pressedKeySequence.Add(key); - } - else + if (!ProcessKeyList(down, key)) { - _pressedKeySequence.RemoveAll(k => k == key); + return false; } PressedKeys = _pressedKeySequence.ToArray(); @@ -146,6 +147,33 @@ private bool DeviceOnKeyboardInput(RawKeyboard keyboardData) } } + private bool HasNoListener() + { + var noKeyDownListeners = KeyDown == null || KeyDown.GetInvocationList().Length == 0; + var noKeyUpListeners = KeyUp == null || KeyUp?.GetInvocationList().Length == 0; + return noKeyDownListeners && noKeyUpListeners; + } + + private bool ProcessKeyList(bool down, Keys key) + { + if (down) + { + if (_pressedKeySequence.Contains(key)) + { + // this key is already processed + return false; + } + _pressedKeySequence.Add(key); + } + else + { + var removed = _pressedKeySequence.Remove(key); + return removed; // return if key is removed + } + + return true; + } + private void SetModifierKeys(Keys key, bool down) { switch (key) diff --git a/Project-Aurora/Project-Aurora/Modules/Inputs/KeyRecorder.cs b/Project-Aurora/Project-Aurora/Modules/Inputs/KeyRecorder.cs index 36526aecd..fc68e9a4a 100644 --- a/Project-Aurora/Project-Aurora/Modules/Inputs/KeyRecorder.cs +++ b/Project-Aurora/Project-Aurora/Modules/Inputs/KeyRecorder.cs @@ -9,7 +9,7 @@ public sealed class KeyRecorder : IDisposable private readonly IInputEvents _inputEvents; private string _recordingType = ""; private bool _isSingleKey; - private List _recordedKeys = new(); + private List _recordedKeys = []; public delegate void RecordingFinishedHandler(DeviceKeys[] resultingKeys); public event RecordingFinishedHandler? FinishedRecording;