ConsoleKeyMapping.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. namespace Terminal.Gui {
  6. /// <summary>
  7. /// Helper class to handle the scan code and virtual key from a <see cref="ConsoleKey"/>.
  8. /// </summary>
  9. public static class ConsoleKeyMapping {
  10. private class ScanCodeMapping : IEquatable<ScanCodeMapping> {
  11. public uint ScanCode;
  12. public uint VirtualKey;
  13. public ConsoleModifiers Modifiers;
  14. public uint UnicodeChar;
  15. public ScanCodeMapping (uint scanCode, uint virtualKey, ConsoleModifiers modifiers, uint unicodeChar)
  16. {
  17. ScanCode = scanCode;
  18. VirtualKey = virtualKey;
  19. Modifiers = modifiers;
  20. UnicodeChar = unicodeChar;
  21. }
  22. public bool Equals (ScanCodeMapping other)
  23. {
  24. return (this.ScanCode.Equals (other.ScanCode) &&
  25. this.VirtualKey.Equals (other.VirtualKey) &&
  26. this.Modifiers.Equals (other.Modifiers) &&
  27. this.UnicodeChar.Equals (other.UnicodeChar));
  28. }
  29. }
  30. private static ConsoleModifiers GetModifiers (uint unicodeChar, ConsoleModifiers modifiers, bool isConsoleKey)
  31. {
  32. if (modifiers.HasFlag (ConsoleModifiers.Shift) &&
  33. !modifiers.HasFlag (ConsoleModifiers.Alt) &&
  34. !modifiers.HasFlag (ConsoleModifiers.Control)) {
  35. return ConsoleModifiers.Shift;
  36. } else if (modifiers == (ConsoleModifiers.Alt | ConsoleModifiers.Control)) {
  37. return modifiers;
  38. } else if ((!isConsoleKey || (isConsoleKey && (modifiers.HasFlag (ConsoleModifiers.Shift) ||
  39. modifiers.HasFlag (ConsoleModifiers.Alt) || modifiers.HasFlag (ConsoleModifiers.Control)))) &&
  40. unicodeChar >= 65 && unicodeChar <= 90) {
  41. return ConsoleModifiers.Shift;
  42. }
  43. return 0;
  44. }
  45. private static ScanCodeMapping GetScanCode (string propName, uint keyValue, ConsoleModifiers modifiers)
  46. {
  47. switch (propName) {
  48. case "UnicodeChar":
  49. var sCode = scanCodes.FirstOrDefault ((e) => e.UnicodeChar == keyValue && e.Modifiers == modifiers);
  50. if (sCode == null && modifiers == (ConsoleModifiers.Alt | ConsoleModifiers.Control)) {
  51. return scanCodes.FirstOrDefault ((e) => e.UnicodeChar == keyValue && e.Modifiers == 0);
  52. }
  53. return sCode;
  54. case "VirtualKey":
  55. sCode = scanCodes.FirstOrDefault ((e) => e.VirtualKey == keyValue && e.Modifiers == modifiers);
  56. if (sCode == null && modifiers == (ConsoleModifiers.Alt | ConsoleModifiers.Control)) {
  57. return scanCodes.FirstOrDefault ((e) => e.VirtualKey == keyValue && e.Modifiers == 0);
  58. }
  59. return sCode;
  60. }
  61. return null;
  62. }
  63. /// <summary>
  64. /// Get the <see cref="ConsoleKey"/> from a <see cref="Key"/>.
  65. /// </summary>
  66. /// <param name="keyValue">The key value.</param>
  67. /// <param name="modifiers">The modifiers keys.</param>
  68. /// <param name="scanCode">The resulting scan code.</param>
  69. /// <param name="outputChar">The resulting output character.</param>
  70. /// <returns>The <see cref="ConsoleKey"/> or the <paramref name="outputChar"/>.</returns>
  71. public static uint GetConsoleKeyFromKey (uint keyValue, ConsoleModifiers modifiers, out uint scanCode, out uint outputChar)
  72. {
  73. scanCode = 0;
  74. outputChar = keyValue;
  75. if (keyValue == 0) {
  76. return 0;
  77. }
  78. uint consoleKey = MapKeyToConsoleKey (keyValue, out bool mappable);
  79. if (mappable) {
  80. var mod = GetModifiers (keyValue, modifiers, false);
  81. var scode = GetScanCode ("UnicodeChar", keyValue, mod);
  82. if (scode != null) {
  83. consoleKey = scode.VirtualKey;
  84. scanCode = scode.ScanCode;
  85. outputChar = scode.UnicodeChar;
  86. } else {
  87. consoleKey = consoleKey < 0xff ? (uint)(consoleKey & 0xff | 0xff << 8) : consoleKey;
  88. }
  89. } else {
  90. var mod = GetModifiers (keyValue, modifiers, false);
  91. var scode = GetScanCode ("VirtualKey", consoleKey, mod);
  92. if (scode != null) {
  93. consoleKey = scode.VirtualKey;
  94. scanCode = scode.ScanCode;
  95. outputChar = scode.UnicodeChar;
  96. }
  97. }
  98. return consoleKey;
  99. }
  100. /// <summary>
  101. /// Get the output character from the <see cref="ConsoleKey"/>.
  102. /// </summary>
  103. /// <param name="unicodeChar">The unicode character.</param>
  104. /// <param name="modifiers">The modifiers keys.</param>
  105. /// <param name="consoleKey">The resulting console key.</param>
  106. /// <param name="scanCode">The resulting scan code.</param>
  107. /// <returns>The output character or the <paramref name="consoleKey"/>.</returns>
  108. public static uint GetKeyCharFromConsoleKey (uint unicodeChar, ConsoleModifiers modifiers, out uint consoleKey, out uint scanCode)
  109. {
  110. uint decodedChar = unicodeChar >> 8 == 0xff ? unicodeChar & 0xff : unicodeChar;
  111. uint keyChar = decodedChar;
  112. consoleKey = 0;
  113. var mod = GetModifiers (decodedChar, modifiers, true);
  114. scanCode = 0;
  115. var scode = unicodeChar != 0 && unicodeChar >> 8 != 0xff ? GetScanCode ("VirtualKey", decodedChar, mod) : null;
  116. if (scode != null) {
  117. consoleKey = scode.VirtualKey;
  118. keyChar = scode.UnicodeChar;
  119. scanCode = scode.ScanCode;
  120. }
  121. if (scode == null) {
  122. scode = unicodeChar != 0 ? GetScanCode ("UnicodeChar", decodedChar, mod) : null;
  123. if (scode != null) {
  124. consoleKey = scode.VirtualKey;
  125. keyChar = scode.UnicodeChar;
  126. scanCode = scode.ScanCode;
  127. }
  128. }
  129. if (decodedChar != 0 && scanCode == 0 && char.IsLetter ((char)decodedChar)) {
  130. string stFormD = ((char)decodedChar).ToString ().Normalize (System.Text.NormalizationForm.FormD);
  131. for (int i = 0; i < stFormD.Length; i++) {
  132. UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory (stFormD [i]);
  133. if (uc != UnicodeCategory.NonSpacingMark && uc != UnicodeCategory.OtherLetter) {
  134. consoleKey = char.ToUpper (stFormD [i]);
  135. scode = GetScanCode ("VirtualKey", char.ToUpper (stFormD [i]), 0);
  136. if (scode != null) {
  137. scanCode = scode.ScanCode;
  138. }
  139. }
  140. }
  141. }
  142. return keyChar;
  143. }
  144. /// <summary>
  145. /// Maps a <see cref="Key"/> to a <see cref="ConsoleKey"/>.
  146. /// </summary>
  147. /// <param name="keyValue">The key value.</param>
  148. /// <param name="isMappable">If <see langword="true"/> is mapped to a valid character, otherwise <see langword="false"/>.</param>
  149. /// <returns>The <see cref="ConsoleKey"/> or the <paramref name="keyValue"/>.</returns>
  150. public static uint MapKeyToConsoleKey (uint keyValue, out bool isMappable)
  151. {
  152. isMappable = false;
  153. switch ((Key)keyValue) {
  154. case Key.Delete:
  155. return (uint)ConsoleKey.Delete;
  156. case Key.CursorUp:
  157. return (uint)ConsoleKey.UpArrow;
  158. case Key.CursorDown:
  159. return (uint)ConsoleKey.DownArrow;
  160. case Key.CursorLeft:
  161. return (uint)ConsoleKey.LeftArrow;
  162. case Key.CursorRight:
  163. return (uint)ConsoleKey.RightArrow;
  164. case Key.PageUp:
  165. return (uint)ConsoleKey.PageUp;
  166. case Key.PageDown:
  167. return (uint)ConsoleKey.PageDown;
  168. case Key.Home:
  169. return (uint)ConsoleKey.Home;
  170. case Key.End:
  171. return (uint)ConsoleKey.End;
  172. case Key.InsertChar:
  173. return (uint)ConsoleKey.Insert;
  174. case Key.DeleteChar:
  175. return (uint)ConsoleKey.Delete;
  176. case Key.F1:
  177. return (uint)ConsoleKey.F1;
  178. case Key.F2:
  179. return (uint)ConsoleKey.F2;
  180. case Key.F3:
  181. return (uint)ConsoleKey.F3;
  182. case Key.F4:
  183. return (uint)ConsoleKey.F4;
  184. case Key.F5:
  185. return (uint)ConsoleKey.F5;
  186. case Key.F6:
  187. return (uint)ConsoleKey.F6;
  188. case Key.F7:
  189. return (uint)ConsoleKey.F7;
  190. case Key.F8:
  191. return (uint)ConsoleKey.F8;
  192. case Key.F9:
  193. return (uint)ConsoleKey.F9;
  194. case Key.F10:
  195. return (uint)ConsoleKey.F10;
  196. case Key.F11:
  197. return (uint)ConsoleKey.F11;
  198. case Key.F12:
  199. return (uint)ConsoleKey.F12;
  200. case Key.F13:
  201. return (uint)ConsoleKey.F13;
  202. case Key.F14:
  203. return (uint)ConsoleKey.F14;
  204. case Key.F15:
  205. return (uint)ConsoleKey.F15;
  206. case Key.F16:
  207. return (uint)ConsoleKey.F16;
  208. case Key.F17:
  209. return (uint)ConsoleKey.F17;
  210. case Key.F18:
  211. return (uint)ConsoleKey.F18;
  212. case Key.F19:
  213. return (uint)ConsoleKey.F19;
  214. case Key.F20:
  215. return (uint)ConsoleKey.F20;
  216. case Key.F21:
  217. return (uint)ConsoleKey.F21;
  218. case Key.F22:
  219. return (uint)ConsoleKey.F22;
  220. case Key.F23:
  221. return (uint)ConsoleKey.F23;
  222. case Key.F24:
  223. return (uint)ConsoleKey.F24;
  224. case Key.BackTab:
  225. return (uint)ConsoleKey.Tab;
  226. case Key.Unknown:
  227. isMappable = true;
  228. return 0;
  229. }
  230. isMappable = true;
  231. return keyValue;
  232. }
  233. /// <summary>
  234. /// Maps a <see cref="ConsoleKey"/> to a <see cref="Key"/>.
  235. /// </summary>
  236. /// <param name="consoleKey">The console key.</param>
  237. /// <param name="isMappable">If <see langword="true"/> is mapped to a valid character, otherwise <see langword="false"/>.</param>
  238. /// <returns>The <see cref="Key"/> or the <paramref name="consoleKey"/>.</returns>
  239. public static Key MapConsoleKeyToKey (ConsoleKey consoleKey, out bool isMappable)
  240. {
  241. isMappable = false;
  242. switch (consoleKey) {
  243. case ConsoleKey.Delete:
  244. return Key.Delete;
  245. case ConsoleKey.UpArrow:
  246. return Key.CursorUp;
  247. case ConsoleKey.DownArrow:
  248. return Key.CursorDown;
  249. case ConsoleKey.LeftArrow:
  250. return Key.CursorLeft;
  251. case ConsoleKey.RightArrow:
  252. return Key.CursorRight;
  253. case ConsoleKey.PageUp:
  254. return Key.PageUp;
  255. case ConsoleKey.PageDown:
  256. return Key.PageDown;
  257. case ConsoleKey.Home:
  258. return Key.Home;
  259. case ConsoleKey.End:
  260. return Key.End;
  261. case ConsoleKey.Insert:
  262. return Key.InsertChar;
  263. case ConsoleKey.F1:
  264. return Key.F1;
  265. case ConsoleKey.F2:
  266. return Key.F2;
  267. case ConsoleKey.F3:
  268. return Key.F3;
  269. case ConsoleKey.F4:
  270. return Key.F4;
  271. case ConsoleKey.F5:
  272. return Key.F5;
  273. case ConsoleKey.F6:
  274. return Key.F6;
  275. case ConsoleKey.F7:
  276. return Key.F7;
  277. case ConsoleKey.F8:
  278. return Key.F8;
  279. case ConsoleKey.F9:
  280. return Key.F9;
  281. case ConsoleKey.F10:
  282. return Key.F10;
  283. case ConsoleKey.F11:
  284. return Key.F11;
  285. case ConsoleKey.F12:
  286. return Key.F12;
  287. case ConsoleKey.F13:
  288. return Key.F13;
  289. case ConsoleKey.F14:
  290. return Key.F14;
  291. case ConsoleKey.F15:
  292. return Key.F15;
  293. case ConsoleKey.F16:
  294. return Key.F16;
  295. case ConsoleKey.F17:
  296. return Key.F17;
  297. case ConsoleKey.F18:
  298. return Key.F18;
  299. case ConsoleKey.F19:
  300. return Key.F19;
  301. case ConsoleKey.F20:
  302. return Key.F20;
  303. case ConsoleKey.F21:
  304. return Key.F21;
  305. case ConsoleKey.F22:
  306. return Key.F22;
  307. case ConsoleKey.F23:
  308. return Key.F23;
  309. case ConsoleKey.F24:
  310. return Key.F24;
  311. case ConsoleKey.Tab:
  312. return Key.BackTab;
  313. }
  314. isMappable = true;
  315. return (Key)consoleKey;
  316. }
  317. private static HashSet<ScanCodeMapping> scanCodes = new HashSet<ScanCodeMapping> {
  318. new ScanCodeMapping (1,27,0,27), // Escape
  319. new ScanCodeMapping (1,27,ConsoleModifiers.Shift,27),
  320. new ScanCodeMapping (2,49,0,49), // D1
  321. new ScanCodeMapping (2,49,ConsoleModifiers.Shift,33),
  322. new ScanCodeMapping (3,50,0,50), // D2
  323. new ScanCodeMapping (3,50,ConsoleModifiers.Shift,34),
  324. new ScanCodeMapping (3,50,ConsoleModifiers.Alt | ConsoleModifiers.Control,64),
  325. new ScanCodeMapping (4,51,0,51), // D3
  326. new ScanCodeMapping (4,51,ConsoleModifiers.Shift,35),
  327. new ScanCodeMapping (4,51,ConsoleModifiers.Alt | ConsoleModifiers.Control,163),
  328. new ScanCodeMapping (5,52,0,52), // D4
  329. new ScanCodeMapping (5,52,ConsoleModifiers.Shift,36),
  330. new ScanCodeMapping (5,52,ConsoleModifiers.Alt | ConsoleModifiers.Control,167),
  331. new ScanCodeMapping (6,53,0,53), // D5
  332. new ScanCodeMapping (6,53,ConsoleModifiers.Shift,37),
  333. new ScanCodeMapping (6,53,ConsoleModifiers.Alt | ConsoleModifiers.Control,8364),
  334. new ScanCodeMapping (7,54,0,54), // D6
  335. new ScanCodeMapping (7,54,ConsoleModifiers.Shift,38),
  336. new ScanCodeMapping (8,55,0,55), // D7
  337. new ScanCodeMapping (8,55,ConsoleModifiers.Shift,47),
  338. new ScanCodeMapping (8,55,ConsoleModifiers.Alt | ConsoleModifiers.Control,123),
  339. new ScanCodeMapping (9,56,0,56), // D8
  340. new ScanCodeMapping (9,56,ConsoleModifiers.Shift,40),
  341. new ScanCodeMapping (9,56,ConsoleModifiers.Alt | ConsoleModifiers.Control,91),
  342. new ScanCodeMapping (10,57,0,57), // D9
  343. new ScanCodeMapping (10,57,ConsoleModifiers.Shift,41),
  344. new ScanCodeMapping (10,57,ConsoleModifiers.Alt | ConsoleModifiers.Control,93),
  345. new ScanCodeMapping (11,48,0,48), // D0
  346. new ScanCodeMapping (11,48,ConsoleModifiers.Shift,61),
  347. new ScanCodeMapping (11,48,ConsoleModifiers.Alt | ConsoleModifiers.Control,125),
  348. new ScanCodeMapping (12,219,0,39), // Oem4
  349. new ScanCodeMapping (12,219,ConsoleModifiers.Shift,63),
  350. new ScanCodeMapping (13,221,0,171), // Oem6
  351. new ScanCodeMapping (13,221,ConsoleModifiers.Shift,187),
  352. new ScanCodeMapping (14,8,0,8), // Backspace
  353. new ScanCodeMapping (14,8,ConsoleModifiers.Shift,8),
  354. new ScanCodeMapping (15,9,0,9), // Tab
  355. new ScanCodeMapping (15,9,ConsoleModifiers.Shift,15),
  356. new ScanCodeMapping (16,81,0,113), // Q
  357. new ScanCodeMapping (16,81,ConsoleModifiers.Shift,81),
  358. new ScanCodeMapping (17,87,0,119), // W
  359. new ScanCodeMapping (17,87,ConsoleModifiers.Shift,87),
  360. new ScanCodeMapping (18,69,0,101), // E
  361. new ScanCodeMapping (18,69,ConsoleModifiers.Shift,69),
  362. new ScanCodeMapping (19,82,0,114), // R
  363. new ScanCodeMapping (19,82,ConsoleModifiers.Shift,82),
  364. new ScanCodeMapping (20,84,0,116), // T
  365. new ScanCodeMapping (20,84,ConsoleModifiers.Shift,84),
  366. new ScanCodeMapping (21,89,0,121), // Y
  367. new ScanCodeMapping (21,89,ConsoleModifiers.Shift,89),
  368. new ScanCodeMapping (22,85,0,117), // U
  369. new ScanCodeMapping (22,85,ConsoleModifiers.Shift,85),
  370. new ScanCodeMapping (23,73,0,105), // I
  371. new ScanCodeMapping (23,73,ConsoleModifiers.Shift,73),
  372. new ScanCodeMapping (24,79,0,111), // O
  373. new ScanCodeMapping (24,79,ConsoleModifiers.Shift,79),
  374. new ScanCodeMapping (25,80,0,112), // P
  375. new ScanCodeMapping (25,80,ConsoleModifiers.Shift,80),
  376. new ScanCodeMapping (26,187,0,43), // OemPlus
  377. new ScanCodeMapping (26,187,ConsoleModifiers.Shift,42),
  378. new ScanCodeMapping (26,187,ConsoleModifiers.Alt | ConsoleModifiers.Control,168),
  379. new ScanCodeMapping (27,186,0,180), // Oem1
  380. new ScanCodeMapping (27,186,ConsoleModifiers.Shift,96),
  381. new ScanCodeMapping (28,13,0,13), // Enter
  382. new ScanCodeMapping (28,13,ConsoleModifiers.Shift,13),
  383. new ScanCodeMapping (29,17,0,0), // Control
  384. new ScanCodeMapping (29,17,ConsoleModifiers.Shift,0),
  385. new ScanCodeMapping (30,65,0,97), // A
  386. new ScanCodeMapping (30,65,ConsoleModifiers.Shift,65),
  387. new ScanCodeMapping (31,83,0,115), // S
  388. new ScanCodeMapping (31,83,ConsoleModifiers.Shift,83),
  389. new ScanCodeMapping (32,68,0,100), // D
  390. new ScanCodeMapping (32,68,ConsoleModifiers.Shift,68),
  391. new ScanCodeMapping (33,70,0,102), // F
  392. new ScanCodeMapping (33,70,ConsoleModifiers.Shift,70),
  393. new ScanCodeMapping (34,71,0,103), // G
  394. new ScanCodeMapping (34,71,ConsoleModifiers.Shift,71),
  395. new ScanCodeMapping (35,72,0,104), // H
  396. new ScanCodeMapping (35,72,ConsoleModifiers.Shift,72),
  397. new ScanCodeMapping (36,74,0,106), // J
  398. new ScanCodeMapping (36,74,ConsoleModifiers.Shift,74),
  399. new ScanCodeMapping (37,75,0,107), // K
  400. new ScanCodeMapping (37,75,ConsoleModifiers.Shift,75),
  401. new ScanCodeMapping (38,76,0,108), // L
  402. new ScanCodeMapping (38,76,ConsoleModifiers.Shift,76),
  403. new ScanCodeMapping (39,192,0,231), // Oem3
  404. new ScanCodeMapping (39,192,ConsoleModifiers.Shift,199),
  405. new ScanCodeMapping (40,222,0,186), // Oem7
  406. new ScanCodeMapping (40,222,ConsoleModifiers.Shift,170),
  407. new ScanCodeMapping (41,220,0,92), // Oem5
  408. new ScanCodeMapping (41,220,ConsoleModifiers.Shift,124),
  409. new ScanCodeMapping (42,16,0,0), // LShift
  410. new ScanCodeMapping (42,16,ConsoleModifiers.Shift,0),
  411. new ScanCodeMapping (43,191,0,126), // Oem2
  412. new ScanCodeMapping (43,191,ConsoleModifiers.Shift,94),
  413. new ScanCodeMapping (44,90,0,122), // Z
  414. new ScanCodeMapping (44,90,ConsoleModifiers.Shift,90),
  415. new ScanCodeMapping (45,88,0,120), // X
  416. new ScanCodeMapping (45,88,ConsoleModifiers.Shift,88),
  417. new ScanCodeMapping (46,67,0,99), // C
  418. new ScanCodeMapping (46,67,ConsoleModifiers.Shift,67),
  419. new ScanCodeMapping (47,86,0,118), // V
  420. new ScanCodeMapping (47,86,ConsoleModifiers.Shift,86),
  421. new ScanCodeMapping (48,66,0,98), // B
  422. new ScanCodeMapping (48,66,ConsoleModifiers.Shift,66),
  423. new ScanCodeMapping (49,78,0,110), // N
  424. new ScanCodeMapping (49,78,ConsoleModifiers.Shift,78),
  425. new ScanCodeMapping (50,77,0,109), // M
  426. new ScanCodeMapping (50,77,ConsoleModifiers.Shift,77),
  427. new ScanCodeMapping (51,188,0,44), // OemComma
  428. new ScanCodeMapping (51,188,ConsoleModifiers.Shift,59),
  429. new ScanCodeMapping (52,190,0,46), // OemPeriod
  430. new ScanCodeMapping (52,190,ConsoleModifiers.Shift,58),
  431. new ScanCodeMapping (53,189,0,45), // OemMinus
  432. new ScanCodeMapping (53,189,ConsoleModifiers.Shift,95),
  433. new ScanCodeMapping (54,16,0,0), // RShift
  434. new ScanCodeMapping (54,16,ConsoleModifiers.Shift,0),
  435. new ScanCodeMapping (55,44,0,0), // PrintScreen
  436. new ScanCodeMapping (55,44,ConsoleModifiers.Shift,0),
  437. new ScanCodeMapping (56,18,0,0), // Alt
  438. new ScanCodeMapping (56,18,ConsoleModifiers.Shift,0),
  439. new ScanCodeMapping (57,32,0,32), // Spacebar
  440. new ScanCodeMapping (57,32,ConsoleModifiers.Shift,32),
  441. new ScanCodeMapping (58,20,0,0), // Caps
  442. new ScanCodeMapping (58,20,ConsoleModifiers.Shift,0),
  443. new ScanCodeMapping (59,112,0,0), // F1
  444. new ScanCodeMapping (59,112,ConsoleModifiers.Shift,0),
  445. new ScanCodeMapping (60,113,0,0), // F2
  446. new ScanCodeMapping (60,113,ConsoleModifiers.Shift,0),
  447. new ScanCodeMapping (61,114,0,0), // F3
  448. new ScanCodeMapping (61,114,ConsoleModifiers.Shift,0),
  449. new ScanCodeMapping (62,115,0,0), // F4
  450. new ScanCodeMapping (62,115,ConsoleModifiers.Shift,0),
  451. new ScanCodeMapping (63,116,0,0), // F5
  452. new ScanCodeMapping (63,116,ConsoleModifiers.Shift,0),
  453. new ScanCodeMapping (64,117,0,0), // F6
  454. new ScanCodeMapping (64,117,ConsoleModifiers.Shift,0),
  455. new ScanCodeMapping (65,118,0,0), // F7
  456. new ScanCodeMapping (65,118,ConsoleModifiers.Shift,0),
  457. new ScanCodeMapping (66,119,0,0), // F8
  458. new ScanCodeMapping (66,119,ConsoleModifiers.Shift,0),
  459. new ScanCodeMapping (67,120,0,0), // F9
  460. new ScanCodeMapping (67,120,ConsoleModifiers.Shift,0),
  461. new ScanCodeMapping (68,121,0,0), // F10
  462. new ScanCodeMapping (68,121,ConsoleModifiers.Shift,0),
  463. new ScanCodeMapping (69,144,0,0), // Num
  464. new ScanCodeMapping (69,144,ConsoleModifiers.Shift,0),
  465. new ScanCodeMapping (70,145,0,0), // Scroll
  466. new ScanCodeMapping (70,145,ConsoleModifiers.Shift,0),
  467. new ScanCodeMapping (71,36,0,0), // Home
  468. new ScanCodeMapping (71,36,ConsoleModifiers.Shift,0),
  469. new ScanCodeMapping (72,38,0,0), // UpArrow
  470. new ScanCodeMapping (72,38,ConsoleModifiers.Shift,0),
  471. new ScanCodeMapping (73,33,0,0), // PageUp
  472. new ScanCodeMapping (73,33,ConsoleModifiers.Shift,0),
  473. new ScanCodeMapping (74,109,0,45), // Subtract
  474. new ScanCodeMapping (74,109,ConsoleModifiers.Shift,45),
  475. new ScanCodeMapping (75,37,0,0), // LeftArrow
  476. new ScanCodeMapping (75,37,ConsoleModifiers.Shift,0),
  477. new ScanCodeMapping (76,12,0,0), // Center
  478. new ScanCodeMapping (76,12,ConsoleModifiers.Shift,0),
  479. new ScanCodeMapping (77,39,0,0), // RightArrow
  480. new ScanCodeMapping (77,39,ConsoleModifiers.Shift,0),
  481. new ScanCodeMapping (78,107,0,43), // Add
  482. new ScanCodeMapping (78,107,ConsoleModifiers.Shift,43),
  483. new ScanCodeMapping (79,35,0,0), // End
  484. new ScanCodeMapping (79,35,ConsoleModifiers.Shift,0),
  485. new ScanCodeMapping (80,40,0,0), // DownArrow
  486. new ScanCodeMapping (80,40,ConsoleModifiers.Shift,0),
  487. new ScanCodeMapping (81,34,0,0), // PageDown
  488. new ScanCodeMapping (81,34,ConsoleModifiers.Shift,0),
  489. new ScanCodeMapping (82,45,0,0), // Insert
  490. new ScanCodeMapping (82,45,ConsoleModifiers.Shift,0),
  491. new ScanCodeMapping (83,46,0,0), // Delete
  492. new ScanCodeMapping (83,46,ConsoleModifiers.Shift,0),
  493. new ScanCodeMapping (86,226,0,60), // OEM 102
  494. new ScanCodeMapping (86,226,ConsoleModifiers.Shift,62),
  495. new ScanCodeMapping (87,122,0,0), // F11
  496. new ScanCodeMapping (87,122,ConsoleModifiers.Shift,0),
  497. new ScanCodeMapping (88,123,0,0), // F12
  498. new ScanCodeMapping (88,123,ConsoleModifiers.Shift,0)
  499. };
  500. }
  501. }