@@ -52,8 +52,9 @@ public static extern bool ScrollConsoleScreenBuffer(IntPtr hConsoleOutput,
52
52
[ DllImport ( "user32.dll" , SetLastError = true ) ]
53
53
public static extern uint MapVirtualKey ( uint uCode , uint uMapType ) ;
54
54
55
- [ DllImport ( "user32.dll" ) ]
56
- public static extern int ToAscii ( uint uVirtKey , uint uScanCode , byte [ ] lpKeyState , [ Out ] StringBuilder lpChar , uint uFlags ) ;
55
+ [ DllImport ( "user32.dll" , CharSet = CharSet . Unicode ) ]
56
+ public static extern int ToUnicode ( uint uVirtKey , uint uScanCode , byte [ ] lpKeyState ,
57
+ [ MarshalAs ( UnmanagedType . LPArray ) ] [ Out ] char [ ] chars , int charMaxCount , uint flags ) ;
57
58
58
59
[ DllImport ( "user32.dll" , CharSet = CharSet . Unicode , SetLastError = true ) ]
59
60
public static extern short VkKeyScan ( char @char ) ;
@@ -179,6 +180,8 @@ public static class ConsoleKeyInfoExtension
179
180
{
180
181
public static string ToGestureString ( this ConsoleKeyInfo key )
181
182
{
183
+ var mods = key . Modifiers ;
184
+
182
185
var sb = new StringBuilder ( ) ;
183
186
if ( key . Modifiers . HasFlag ( ConsoleModifiers . Control ) )
184
187
{
@@ -190,45 +193,26 @@ public static string ToGestureString(this ConsoleKeyInfo key)
190
193
sb . Append ( "+" ) ;
191
194
sb . Append ( "Alt" ) ;
192
195
}
193
- if ( key . Modifiers . HasFlag ( ConsoleModifiers . Shift ) )
196
+
197
+ char c = ConsoleKeyChordConverter . GetCharFromConsoleKey ( key . Key ,
198
+ ( mods & ConsoleModifiers . Shift ) != 0 ? ConsoleModifiers . Shift : 0 ) ;
199
+ if ( char . IsControl ( c ) || char . IsWhiteSpace ( c ) )
194
200
{
201
+ if ( key . Modifiers . HasFlag ( ConsoleModifiers . Shift ) )
202
+ {
203
+ if ( sb . Length > 0 )
204
+ sb . Append ( "+" ) ;
205
+ sb . Append ( "Shift" ) ;
206
+ }
195
207
if ( sb . Length > 0 )
196
208
sb . Append ( "+" ) ;
197
- sb . Append ( "Shift" ) ;
198
- }
199
- if ( sb . Length > 0 )
200
- sb . Append ( "+" ) ;
201
- if ( key . Key >= ConsoleKey . A && key . Key <= ConsoleKey . Z )
202
- {
203
- sb . Append ( ( char ) ( 'A' + key . Key - ConsoleKey . A ) ) ;
204
- }
205
- else if ( key . Key >= ConsoleKey . D0 && key . Key <= ConsoleKey . D9 )
206
- {
207
- sb . Append ( ( char ) ( '0' + key . Key - ConsoleKey . D0 ) ) ;
208
- }
209
- else if ( char . IsLetterOrDigit ( key . KeyChar ) )
210
- {
211
- sb . Append ( key . KeyChar ) ;
209
+ sb . Append ( key . Key ) ;
212
210
}
213
- else switch ( key . Key )
211
+ else
214
212
{
215
- case ConsoleKey . Oem1 : sb . Append ( ';' ) ; break ;
216
- case ConsoleKey . Oem2 : sb . Append ( '/' ) ; break ;
217
- case ConsoleKey . Oem3 : sb . Append ( '`' ) ; break ;
218
- case ConsoleKey . Oem4 : sb . Append ( '[' ) ; break ;
219
- case ConsoleKey . Oem6 : sb . Append ( ']' ) ; break ;
220
- case ConsoleKey . Oem7 : sb . Append ( '`' ) ; break ;
221
- case ConsoleKey . Oem8 : sb . Append ( '`' ) ; break ;
222
- case ConsoleKey . OemComma : sb . Append ( ',' ) ; break ;
223
- case ConsoleKey . OemPeriod : sb . Append ( '.' ) ; break ;
224
- case ConsoleKey . OemMinus : sb . Append ( '-' ) ; break ;
225
- case ConsoleKey . OemPlus : sb . Append ( '+' ) ; break ;
226
- //case ConsoleKey.Oem102:
227
- //case ConsoleKey.OemClear:
228
- //case ConsoleKey.Oem5:
229
- default :
230
- sb . Append ( key . Key ) ;
231
- break ;
213
+ if ( sb . Length > 0 )
214
+ sb . Append ( "+" ) ;
215
+ sb . Append ( c ) ;
232
216
}
233
217
return sb . ToString ( ) ;
234
218
}
0 commit comments