@@ -180,11 +180,12 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
180
180
return LoadIcon ( requestIcon , requestDpi ) ? . Handle ?? default ;
181
181
182
182
case WindowsMessage . WM_KEYDOWN :
183
+ e = TryCreateRawKeyEventArgs ( RawKeyEventType . KeyDown , timestamp , wParam , lParam , true ) ;
184
+ break ;
185
+
183
186
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 ;
188
189
189
190
case WindowsMessage . WM_SYSCOMMAND :
190
191
// Disable system handling of Alt/F10 menu keys.
@@ -199,11 +200,15 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
199
200
}
200
201
201
202
case WindowsMessage . WM_KEYUP :
203
+ e = TryCreateRawKeyEventArgs ( RawKeyEventType . KeyUp , timestamp , wParam , lParam , true ) ;
204
+ _ignoreWmChar = false ;
205
+ break ;
206
+
202
207
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
+
207
212
case WindowsMessage . WM_CHAR :
208
213
{
209
214
if ( Imm32InputMethod . Current . IsComposing )
@@ -219,6 +224,7 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
219
224
e = new RawTextInputEventArgs ( WindowsKeyboardDevice . Instance , timestamp , Owner , text ) ;
220
225
}
221
226
227
+ _ignoreWmChar = false ;
222
228
break ;
223
229
}
224
230
@@ -881,7 +887,7 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
881
887
// is handled.
882
888
_ignoreWmChar = e . Handled ;
883
889
}
884
- }
890
+ }
885
891
886
892
if ( s_intermediatePointsPooledList . Count > 0 )
887
893
{
@@ -1314,13 +1320,16 @@ private static RawInputModifiers GetInputModifiers(PointerFlags flags)
1314
1320
return modifiers ;
1315
1321
}
1316
1322
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 )
1318
1324
{
1319
1325
var virtualKey = ToInt32 ( wParam ) ;
1320
1326
var keyData = ToInt32 ( lParam ) ;
1321
1327
var key = KeyInterop . KeyFromVirtualKey ( virtualKey , keyData ) ;
1322
1328
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 ;
1324
1333
1325
1334
if ( key == Key . None && physicalKey == PhysicalKey . None && string . IsNullOrWhiteSpace ( keySymbol ) )
1326
1335
return null ;
0 commit comments