Skip to content

Commit 08a9f7b

Browse files
committed
Avoid calling ToUnicodeEx in WM_SYSKEYDOWN (#18624)
1 parent 5a8ce64 commit 08a9f7b

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

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

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,12 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
168168
return LoadIcon(requestIcon, requestDpi)?.Handle ?? default;
169169

170170
case WindowsMessage.WM_KEYDOWN:
171+
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyDown, timestamp, wParam, lParam, true);
172+
break;
173+
171174
case WindowsMessage.WM_SYSKEYDOWN:
172-
{
173-
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyDown, timestamp, wParam, lParam);
174-
break;
175-
}
175+
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyDown, timestamp, wParam, lParam, false);
176+
break;
176177

177178
case WindowsMessage.WM_SYSCOMMAND:
178179
// Disable system handling of Alt/F10 menu keys.
@@ -187,11 +188,15 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
187188
}
188189

189190
case WindowsMessage.WM_KEYUP:
191+
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyUp, timestamp, wParam, lParam, true);
192+
_ignoreWmChar = false;
193+
break;
194+
190195
case WindowsMessage.WM_SYSKEYUP:
191-
{
192-
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyUp, timestamp, wParam, lParam);
193-
break;
194-
}
196+
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyUp, timestamp, wParam, lParam, false);
197+
_ignoreWmChar = false;
198+
break;
199+
195200
case WindowsMessage.WM_CHAR:
196201
{
197202
if (Imm32InputMethod.Current.IsComposing)
@@ -207,6 +212,7 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
207212
e = new RawTextInputEventArgs(WindowsKeyboardDevice.Instance, timestamp, Owner, text);
208213
}
209214

215+
_ignoreWmChar = false;
210216
break;
211217
}
212218

@@ -837,7 +843,7 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
837843
// is handled.
838844
_ignoreWmChar = e.Handled;
839845
}
840-
}
846+
}
841847

842848
if (s_intermediatePointsPooledList.Count > 0)
843849
{
@@ -1234,13 +1240,16 @@ private static RawInputModifiers GetInputModifiers(PointerFlags flags)
12341240
return modifiers;
12351241
}
12361242

1237-
private RawKeyEventArgs? TryCreateRawKeyEventArgs(RawKeyEventType eventType, ulong timestamp, IntPtr wParam, IntPtr lParam)
1243+
private RawKeyEventArgs? TryCreateRawKeyEventArgs(RawKeyEventType eventType, ulong timestamp, IntPtr wParam, IntPtr lParam, bool useKeySymbol)
12381244
{
12391245
var virtualKey = ToInt32(wParam);
12401246
var keyData = ToInt32(lParam);
12411247
var key = KeyInterop.KeyFromVirtualKey(virtualKey, keyData);
12421248
var physicalKey = KeyInterop.PhysicalKeyFromVirtualKey(virtualKey, keyData);
1243-
var keySymbol = KeyInterop.GetKeySymbol(virtualKey, keyData);
1249+
1250+
// Avoid calling GetKeySymbol() for WM_SYSKEYDOWN/UP:
1251+
// it ultimately calls User32!ToUnicodeEx, which messes up the keyboard state in this case.
1252+
var keySymbol = useKeySymbol ? KeyInterop.GetKeySymbol(virtualKey, keyData) : null;
12441253

12451254
if (key == Key.None && physicalKey == PhysicalKey.None && string.IsNullOrWhiteSpace(keySymbol))
12461255
return null;

0 commit comments

Comments
 (0)