Browse Source

Avoid calling ToUnicodeEx in WM_SYSKEYDOWN (#18624)

release/11.2.7
Julien Lebosquain 1 year ago
parent
commit
08a9f7b686
  1. 31
      src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs

31
src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs

@ -168,11 +168,12 @@ namespace Avalonia.Win32
return LoadIcon(requestIcon, requestDpi)?.Handle ?? default;
case WindowsMessage.WM_KEYDOWN:
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyDown, timestamp, wParam, lParam, true);
break;
case WindowsMessage.WM_SYSKEYDOWN:
{
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyDown, timestamp, wParam, lParam);
break;
}
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyDown, timestamp, wParam, lParam, false);
break;
case WindowsMessage.WM_SYSCOMMAND:
// Disable system handling of Alt/F10 menu keys.
@ -187,11 +188,15 @@ namespace Avalonia.Win32
}
case WindowsMessage.WM_KEYUP:
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyUp, timestamp, wParam, lParam, true);
_ignoreWmChar = false;
break;
case WindowsMessage.WM_SYSKEYUP:
{
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyUp, timestamp, wParam, lParam);
break;
}
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyUp, timestamp, wParam, lParam, false);
_ignoreWmChar = false;
break;
case WindowsMessage.WM_CHAR:
{
if (Imm32InputMethod.Current.IsComposing)
@ -207,6 +212,7 @@ namespace Avalonia.Win32
e = new RawTextInputEventArgs(WindowsKeyboardDevice.Instance, timestamp, Owner, text);
}
_ignoreWmChar = false;
break;
}
@ -837,7 +843,7 @@ namespace Avalonia.Win32
// is handled.
_ignoreWmChar = e.Handled;
}
}
}
if (s_intermediatePointsPooledList.Count > 0)
{
@ -1234,13 +1240,16 @@ namespace Avalonia.Win32
return modifiers;
}
private RawKeyEventArgs? TryCreateRawKeyEventArgs(RawKeyEventType eventType, ulong timestamp, IntPtr wParam, IntPtr lParam)
private RawKeyEventArgs? TryCreateRawKeyEventArgs(RawKeyEventType eventType, ulong timestamp, IntPtr wParam, IntPtr lParam, bool useKeySymbol)
{
var virtualKey = ToInt32(wParam);
var keyData = ToInt32(lParam);
var key = KeyInterop.KeyFromVirtualKey(virtualKey, keyData);
var physicalKey = KeyInterop.PhysicalKeyFromVirtualKey(virtualKey, keyData);
var keySymbol = KeyInterop.GetKeySymbol(virtualKey, keyData);
// Avoid calling GetKeySymbol() for WM_SYSKEYDOWN/UP:
// it ultimately calls User32!ToUnicodeEx, which messes up the keyboard state in this case.
var keySymbol = useKeySymbol ? KeyInterop.GetKeySymbol(virtualKey, keyData) : null;
if (key == Key.None && physicalKey == PhysicalKey.None && string.IsNullOrWhiteSpace(keySymbol))
return null;

Loading…
Cancel
Save