From be4d1ef0382216640102522b6914989aac99623c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20Komosi=C5=84ski?= Date: Tue, 3 Dec 2019 16:37:22 +0100 Subject: [PATCH] Fix right ALT and CTRL being reported as left. --- src/Avalonia.Input/AccessKeyHandler.cs | 3 ++- .../Avalonia.Win32/Input/KeyInterop.cs | 21 ++++++++++++++++--- src/Windows/Avalonia.Win32/WindowImpl.cs | 4 ++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Input/AccessKeyHandler.cs b/src/Avalonia.Input/AccessKeyHandler.cs index aa009770f6..00e68d629b 100644 --- a/src/Avalonia.Input/AccessKeyHandler.cs +++ b/src/Avalonia.Input/AccessKeyHandler.cs @@ -140,7 +140,7 @@ namespace Avalonia.Input /// The event args. protected virtual void OnPreviewKeyDown(object sender, KeyEventArgs e) { - if (e.Key == Key.LeftAlt) + if (e.Key == Key.LeftAlt || e.Key == Key.RightAlt) { _altIsDown = true; @@ -218,6 +218,7 @@ namespace Avalonia.Input switch (e.Key) { case Key.LeftAlt: + case Key.RightAlt: _altIsDown = false; if (_ignoreAltUp) diff --git a/src/Windows/Avalonia.Win32/Input/KeyInterop.cs b/src/Windows/Avalonia.Win32/Input/KeyInterop.cs index 11c0a6dca9..acb4f52d88 100644 --- a/src/Windows/Avalonia.Win32/Input/KeyInterop.cs +++ b/src/Windows/Avalonia.Win32/Input/KeyInterop.cs @@ -364,10 +364,25 @@ namespace Avalonia.Win32.Input { 254, Key.OemClear }, }; - public static Key KeyFromVirtualKey(int virtualKey) + public static Key KeyFromVirtualKey(int virtualKey, int flags) { - Key result; - s_keyFromVirtualKey.TryGetValue(virtualKey, out result); + s_keyFromVirtualKey.TryGetValue(virtualKey, out var result); + + // Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys. + // According to https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-keydown. + const int extendedMask = 1 << 24; + bool isExtended = (flags & extendedMask) != 0; + + if (isExtended) + { + return result switch + { + Key.LeftAlt => Key.RightAlt, + Key.LeftCtrl => Key.RightCtrl, + _ => result + }; + } + return result; } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 66c2432472..9a929bcfb5 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -516,7 +516,7 @@ namespace Avalonia.Win32 timestamp, _owner, RawKeyEventType.KeyDown, - KeyInterop.KeyFromVirtualKey(ToInt32(wParam)), WindowsKeyboardDevice.Instance.Modifiers); + KeyInterop.KeyFromVirtualKey(ToInt32(wParam), ToInt32(lParam)), WindowsKeyboardDevice.Instance.Modifiers); break; case UnmanagedMethods.WindowsMessage.WM_MENUCHAR: @@ -530,7 +530,7 @@ namespace Avalonia.Win32 timestamp, _owner, RawKeyEventType.KeyUp, - KeyInterop.KeyFromVirtualKey(ToInt32(wParam)), WindowsKeyboardDevice.Instance.Modifiers); + KeyInterop.KeyFromVirtualKey(ToInt32(wParam), ToInt32(lParam)), WindowsKeyboardDevice.Instance.Modifiers); break; case UnmanagedMethods.WindowsMessage.WM_CHAR: // Ignore control chars