Skip to content

Commit 93cfa4a

Browse files
authored
Avoid calling ToUnicodeEx in WM_SYSKEYDOWN (#18624)
1 parent c88f9d6 commit 93cfa4a

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
@@ -180,11 +180,12 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
180180
return LoadIcon(requestIcon, requestDpi)?.Handle ?? default;
181181

182182
case WindowsMessage.WM_KEYDOWN:
183+
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyDown, timestamp, wParam, lParam, true);
184+
break;
185+
183186
case WindowsMessage.WM_SYSKEYDOWN:
184-
{
185-
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyDown, timestamp, wParam, lParam);
186-
break;
187-
}
187+
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyDown, timestamp, wParam, lParam, false);
188+
break;
188189

189190
case WindowsMessage.WM_SYSCOMMAND:
190191
// Disable system handling of Alt/F10 menu keys.
@@ -199,11 +200,15 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
199200
}
200201

201202
case WindowsMessage.WM_KEYUP:
203+
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyUp, timestamp, wParam, lParam, true);
204+
_ignoreWmChar = false;
205+
break;
206+
202207
case WindowsMessage.WM_SYSKEYUP:
203-
{
204-
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyUp, timestamp, wParam, lParam);
205-
break;
206-
}
208+
e = TryCreateRawKeyEventArgs(RawKeyEventType.KeyUp, timestamp, wParam, lParam, false);
209+
_ignoreWmChar = false;
210+
break;
211+
207212
case WindowsMessage.WM_CHAR:
208213
{
209214
if (Imm32InputMethod.Current.IsComposing)
@@ -219,6 +224,7 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
219224
e = new RawTextInputEventArgs(WindowsKeyboardDevice.Instance, timestamp, Owner, text);
220225
}
221226

227+
_ignoreWmChar = false;
222228
break;
223229
}
224230

@@ -881,7 +887,7 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
881887
// is handled.
882888
_ignoreWmChar = e.Handled;
883889
}
884-
}
890+
}
885891

886892
if (s_intermediatePointsPooledList.Count > 0)
887893
{
@@ -1314,13 +1320,16 @@ private static RawInputModifiers GetInputModifiers(PointerFlags flags)
13141320
return modifiers;
13151321
}
13161322

1317-
private RawKeyEventArgs? TryCreateRawKeyEventArgs(RawKeyEventType eventType, ulong timestamp, IntPtr wParam, IntPtr lParam)
1323+
private RawKeyEventArgs? TryCreateRawKeyEventArgs(RawKeyEventType eventType, ulong timestamp, IntPtr wParam, IntPtr lParam, bool useKeySymbol)
13181324
{
13191325
var virtualKey = ToInt32(wParam);
13201326
var keyData = ToInt32(lParam);
13211327
var key = KeyInterop.KeyFromVirtualKey(virtualKey, keyData);
13221328
var physicalKey = KeyInterop.PhysicalKeyFromVirtualKey(virtualKey, keyData);
1323-
var keySymbol = KeyInterop.GetKeySymbol(virtualKey, keyData);
1329+
1330+
// Avoid calling GetKeySymbol() for WM_SYSKEYDOWN/UP:
1331+
// it ultimately calls User32!ToUnicodeEx, which messes up the keyboard state in this case.
1332+
var keySymbol = useKeySymbol ? KeyInterop.GetKeySymbol(virtualKey, keyData) : null;
13241333

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

0 commit comments

Comments
 (0)