@@ -168,11 +168,12 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
168
168
return LoadIcon ( requestIcon , requestDpi ) ? . Handle ?? default ;
169
169
170
170
case WindowsMessage . WM_KEYDOWN :
171
+ e = TryCreateRawKeyEventArgs ( RawKeyEventType . KeyDown , timestamp , wParam , lParam , true ) ;
172
+ break ;
173
+
171
174
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 ;
176
177
177
178
case WindowsMessage . WM_SYSCOMMAND :
178
179
// Disable system handling of Alt/F10 menu keys.
@@ -187,11 +188,15 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
187
188
}
188
189
189
190
case WindowsMessage . WM_KEYUP :
191
+ e = TryCreateRawKeyEventArgs ( RawKeyEventType . KeyUp , timestamp , wParam , lParam , true ) ;
192
+ _ignoreWmChar = false ;
193
+ break ;
194
+
190
195
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
+
195
200
case WindowsMessage . WM_CHAR :
196
201
{
197
202
if ( Imm32InputMethod . Current . IsComposing )
@@ -207,6 +212,7 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
207
212
e = new RawTextInputEventArgs ( WindowsKeyboardDevice . Instance , timestamp , Owner , text ) ;
208
213
}
209
214
215
+ _ignoreWmChar = false ;
210
216
break ;
211
217
}
212
218
@@ -837,7 +843,7 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam,
837
843
// is handled.
838
844
_ignoreWmChar = e . Handled ;
839
845
}
840
- }
846
+ }
841
847
842
848
if ( s_intermediatePointsPooledList . Count > 0 )
843
849
{
@@ -1234,13 +1240,16 @@ private static RawInputModifiers GetInputModifiers(PointerFlags flags)
1234
1240
return modifiers ;
1235
1241
}
1236
1242
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 )
1238
1244
{
1239
1245
var virtualKey = ToInt32 ( wParam ) ;
1240
1246
var keyData = ToInt32 ( lParam ) ;
1241
1247
var key = KeyInterop . KeyFromVirtualKey ( virtualKey , keyData ) ;
1242
1248
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 ;
1244
1253
1245
1254
if ( key == Key . None && physicalKey == PhysicalKey . None && string . IsNullOrWhiteSpace ( keySymbol ) )
1246
1255
return null ;
0 commit comments