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;