KeyboardLayouts.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. // Permission is hereby granted, free of charge, to any person obtaining
  2. // a copy of this software and associated documentation files (the
  3. // "Software"), to deal in the Software without restriction, including
  4. // without limitation the rights to use, copy, modify, merge, publish,
  5. // distribute, sublicense, and/or sell copies of the Software, and to
  6. // permit persons to whom the Software is furnished to do so, subject to
  7. // the following conditions:
  8. //
  9. // The above copyright notice and this permission notice shall be
  10. // included in all copies or substantial portions of the Software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  13. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  14. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  15. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  16. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  17. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  18. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  19. //
  20. // Copyright (c) 2004 Novell, Inc.
  21. //
  22. // Authors:
  23. // Jackson Harper ([email protected])
  24. //
  25. //
  26. // TODO:
  27. // - Move these tables into unmanaged code (libgdiplus) and access with a pointer
  28. //
  29. using System;
  30. namespace System.Windows.Forms {
  31. internal class KeyboardLayout {
  32. public string Comment;
  33. public int CodePage;
  34. public string [] Key;
  35. public short [] Scan;
  36. public VirtualKeys [] VKey;
  37. public KeyboardLayout (string comment, int code_page, string [] key, short [] scan, VirtualKeys [] vkey)
  38. {
  39. Comment = comment;
  40. CodePage = code_page;
  41. Key = key;
  42. Scan = scan;
  43. VKey = vkey;
  44. }
  45. }
  46. internal class KeyboardLayouts {
  47. public static readonly int MainLen = 48;
  48. private static readonly string [] main_key_US = new string []
  49. {
  50. "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",
  51. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","[{","]}",
  52. "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:","'\"","\\|",
  53. "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?"
  54. };
  55. private static string [] main_key_US_phantom = new string []
  56. {
  57. "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",
  58. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","[{","]}",
  59. "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:","'\"","\\|",
  60. "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?",
  61. "<>" /* the phantom key */
  62. };
  63. /*** United States keyboard layout (dvorak version) */
  64. private static readonly string [] main_key_US_dvorak = new string []
  65. {
  66. "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","[{","]}",
  67. "'\"",",<",".>","pP","yY","fF","gG","cC","rR","lL","/?","=+",
  68. "aA","oO","eE","uU","iI","dD","hH","tT","nN","sS","-_","\\|",
  69. ";:","qQ","jJ","kK","xX","bB","mM","wW","vV","zZ"
  70. };
  71. /*** British keyboard layout */
  72. private static readonly string [] main_key_UK = new string []
  73. {
  74. "`","1!","2\"","3£","4$","5%","6^","7&","8*","9(","0)","-_","=+",
  75. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","[{","]}",
  76. "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:","'@","#~",
  77. "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?",
  78. "\\|"
  79. };
  80. /*** French keyboard layout (contributed by Eric Pouech) */
  81. private static readonly string [] main_key_FR = new string []
  82. {
  83. "²","&1","é2~","\"3#","'4{","(5[","-6|","è7","_8\\","ç9^±","à0@",")°]","=+}",
  84. "aA","zZ","eE","rR","tT","yY","uU","iI","oO","pP","^¨","$£¤",
  85. "qQ","sSß","dD","fF","gG","hH","jJ","kK","lL","mM","ù%","*µ",
  86. "wW","xX","cC","vV","bB","nN",",?",";.",":/","!§",
  87. "<>"
  88. };
  89. /*** Icelandic keyboard layout (contributed by Ríkharður Egilsson) */
  90. private static readonly string [] main_key_IS = new string []
  91. {
  92. "°","1!","2\"","3#","4$","5%","6&","7/{","8([","9)]","0=}","öÖ\\","-_",
  93. "qQ@","wW","eE","rR","tT","yY","uU","iI","oO","pP","ðÐ","'?~",
  94. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","æÆ","´^","+*`",
  95. "zZ","xX","cC","vV","bB","nN","mM",",;",".:","þÞ",
  96. "<>|"
  97. };
  98. /*** German keyboard layout (contributed by Ulrich Weigand) */
  99. private static readonly string [] main_key_DE = new string []
  100. {
  101. "^°","1!","2\"²","3§³","4$","5%","6&","7/{","8([","9)]","0=}","ß?\\","'`",
  102. "qQ@","wW","eE€","rR","tT","zZ","uU","iI","oO","pP","üÜ","+*~",
  103. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öÖ","äÄ","#´",
  104. "yY","xX","cC","vV","bB","nN","mMµ",",;",".:","-_",
  105. "<>|"
  106. };
  107. /*** German keyboard layout without dead keys */
  108. private static readonly string [] main_key_DE_nodead = new string []
  109. {
  110. "^°","1!","2\"","3§","4$","5%","6&","7/{","8([","9)]","0=}","ß?\\","´",
  111. "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","üÜ","+*~",
  112. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öÖ","äÄ","#'",
  113. "yY","xX","cC","vV","bB","nN","mM",",;",".:","-_",
  114. "<>"
  115. };
  116. /*** Swiss German keyboard layout (contributed by Jonathan Naylor) */
  117. private static readonly string [] main_key_SG = new string []
  118. {
  119. "§°","1+|","2\"@","3*#","4ç","5%","6&¬","7/¦","8(¢","9)","0=","'?´","^`~",
  120. "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","üè[","¨!]",
  121. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öé","äà{","$£}",
  122. "yY","xX","cC","vV","bB","nN","mM",",;",".:","-_",
  123. "<>\\"
  124. };
  125. /*** Swiss French keyboard layout (contributed by Philippe Froidevaux) */
  126. private static readonly string [] main_key_SF = new string []
  127. {
  128. "§°","1+|","2\"@","3*#","4ç","5%","6&¬","7/¦","8(¢","9)","0=","'?´","^`~",
  129. "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","èü[","¨!]",
  130. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","éö","àä{","$£}",
  131. "yY","xX","cC","vV","bB","nN","mM",",;",".:","-_",
  132. "<>\\"
  133. };
  134. /*** Norwegian keyboard layout (contributed by Ove Kåven) */
  135. private static readonly string [] main_key_NO = new string []
  136. {
  137. "|§","1!","2\"@","3#£","4¤$","5%","6&","7/{","8([","9)]","0=}","+?","\\`´",
  138. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","åÅ","¨^~",
  139. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","øØ","æÆ","'*",
  140. "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
  141. "<>"
  142. };
  143. /*** Danish keyboard layout (contributed by Bertho Stultiens) */
  144. private static readonly string [] main_key_DA = new string []
  145. {
  146. "½§","1!","2\"@","3#£","4¤$","5%","6&","7/{","8([","9)]","0=}","+?","´`|",
  147. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","åÅ","¨^~",
  148. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","æÆ","øØ","'*",
  149. "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
  150. "<>\\"
  151. };
  152. /*** Swedish keyboard layout (contributed by Peter Bortas) */
  153. private static readonly string [] main_key_SE = new string []
  154. {
  155. "§½","1!","2\"@","3#£","4¤$","5%","6&","7/{","8([","9)]","0=}","+?\\","´`",
  156. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","åÅ","¨^~",
  157. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öÖ","äÄ","'*",
  158. "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
  159. "<>|"
  160. };
  161. /*** Canadian French keyboard layout */
  162. private static readonly string [] main_key_CF = new string []
  163. {
  164. "#|\\","1!±","2\"@","3/£","4$¢","5%¤","6?¬","7&¦","8*²","9(³","0)¼","-_½","=+¾",
  165. "qQ","wW","eE","rR","tT","yY","uU","iI","oO§","pP¶","^^[","¸¨]",
  166. "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:~","``{","<>}",
  167. "zZ","xX","cC","vV","bB","nN","mM",",'-",".","éÉ",
  168. "«»°"
  169. };
  170. /*** Portuguese keyboard layout */
  171. private static readonly string [] main_key_PT = new string []
  172. {
  173. "\\¦","1!","2\"@","3#£","4$§","5%","6&","7/{","8([","9)]","0=}","'?","«»",
  174. "qQ", "wW","eE", "rR", "tT", "yY", "uU", "iI", "oO", "pP", "+*\\¨","\\'\\`",
  175. "aA", "sS","dD", "fF", "gG", "hH", "jJ", "kK", "lL", "çÇ", "ºª", "\\~\\^",
  176. "zZ", "xX","cC", "vV", "bB", "nN", "mM", ",;", ".:", "-_",
  177. "<>"
  178. };
  179. /*** Italian keyboard layout */
  180. private static readonly string [] main_key_IT = new string []
  181. {
  182. "\\|","1!¹","2\"²","3£³","4$¼","5%½","6&¾","7/{","8([","9)]","0=}","'?`","ì^~",
  183. "qQ@","wW","eE","rR","tT","yY","uU","iI","oOø","pPþ","èé[","+*]",
  184. "aA","sSß","dDð","fF","gG","hH","jJ","kK","lL","òç@","à°#","ù§",
  185. "zZ","xX","cC","vV","bB","nN","mMµ",",;",".:·","-_",
  186. "<>|"
  187. };
  188. /*** Finnish keyboard layout */
  189. private static readonly string [] main_key_FI = new string []
  190. {
  191. "","1!","2\"@","3#","4$","5%","6&","7/{","8([","9)]","0=}","+?\\","\'`",
  192. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","","\"^~",
  193. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","","","'*",
  194. "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
  195. "<>|"
  196. };
  197. /*** Russian keyboard layout (contributed by Pavel Roskin) */
  198. private static readonly string [] main_key_RU = new string []
  199. {
  200. "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",
  201. "qQÊê","wWÃã","eEÕõ","rRËë","tTÅå","yYÎî","uUÇç","iIÛû","oOÝý","pPÚú","[{Èè","]}ßÿ",
  202. "aAÆæ","sSÙù","dD×÷","fFÁá","gGÐð","hHÒò","jJÏï","kKÌì","lLÄä",";:Öö","'\"Üü","\\|",
  203. "zZÑñ","xXÞþ","cCÓó","vVÍí","bBÉé","nNÔô","mMØø",",<Ââ",".>Àà","/?"
  204. };
  205. /*** Russian keyboard layout (phantom key version) */
  206. private static readonly string [] main_key_RU_phantom = new string []
  207. {
  208. "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",
  209. "qQÊê","wWÃã","eEÕõ","rRËë","tTÅå","yYÎî","uUÇç","iIÛû","oOÝý","pPÚú","[{Èè","]}ßÿ",
  210. "aAÆæ","sSÙù","dD×÷","fFÁá","gGÐð","hHÒò","jJÏï","kKÌì","lLÄä",";:Öö","'\"Üü","\\|",
  211. "zZÑñ","xXÞþ","cCÓó","vVÍí","bBÉé","nNÔô","mMØø",",<Ââ",".>Àà","/?",
  212. "<>" /* the phantom key */
  213. };
  214. /*** Russian keyboard layout KOI8-R */
  215. private static readonly string [] main_key_RU_koi8r = new string []
  216. {
  217. "()","1!","2\"","3/","4$","5:","6,","7.","8;","9?","0%","-_","=+",
  218. "Êê","Ãã","Õõ","Ëë","Åå","Îî","Çç","Ûû","Ýý","Úú","Èè","ßÿ",
  219. "Ææ","Ùù","×÷","Áá","Ðð","Òò","Ïï","Ìì","Ää","Öö","Üü","\\|",
  220. "Ññ","Þþ","Óó","Íí","Éé","Ôô","Øø","Ââ","Àà","/?",
  221. "<>" /* the phantom key */
  222. };
  223. /*** Ukrainian keyboard layout KOI8-U */
  224. private static readonly string [] main_key_UA = new string []
  225. {
  226. "`~­½","1!1!","2@2\"","3#3'","4$4*","5%5:","6^6,","7&7.","8*8;","9(9(","0)0)","-_-_","=+=+",
  227. "qQÊê","wWÃã","eEÕõ","rRËë","tTÅå","yYÎî","uUÇç","iIÛû","oOÝý","pPÚú","[{Èè","]}§·",
  228. "aAÆæ","sS¦¶","dD×÷","fFÁá","gGÐð","hHÒò","jJÏï","kKÌì","lLÄä",";:Öö","'\"¤´","\\|\\|",
  229. "zZÑñ","xXÞþ","cCÓó","vVÍí","bBÉé","nNÔô","mMØø",",<Ââ",".>Àà","/?/?",
  230. "<>" /* the phantom key */
  231. };
  232. /*** Spanish keyboard layout (contributed by José Marcos López) */
  233. private static readonly string [] main_key_ES = new string []
  234. {
  235. "ºª\\","1!|","2\"@","3·#","4$","5%","6&¬","7/","8(","9)","0=","'?","¡¿",
  236. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","`^[","+*]",
  237. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","ñÑ","'¨{","çÇ}",
  238. "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
  239. "<>"
  240. };
  241. /*** Belgian keyboard layout ***/
  242. private static readonly string [] main_key_BE = new string []
  243. {
  244. "","&1|","é2@","\"3#","'4","(5","§6^","è7","!8","ç9{","à0}",")°","-_",
  245. "aA","zZ","eE¤","rR","tT","yY","uU","iI","oO","pP","^¨[","$*]",
  246. "qQ","sSß","dD","fF","gG","hH","jJ","kK","lL","mM","ù%´","µ£`",
  247. "wW","xX","cC","vV","bB","nN",",?",";.",":/","=+~",
  248. "<>\\"
  249. };
  250. /*** Hungarian keyboard layout (contributed by Zoltán Kovács) */
  251. private static readonly string [] main_key_HU = new string []
  252. {
  253. "0§","1'~","2\"·","3+^","4!¢","5%°","6/²","7=`","8(ÿ","9)´","öÖ½","üܨ","óÓ¸",
  254. "qQ\\","wW|","eE","rR","tT","zZ","uU","iIÍ","oOø","pP","õÕ÷","úÚ×",
  255. "aA","sSð","dDÐ","fF[","gG]","hH","jJí","kK³","lL£","éÉ$","áÁß","ûÛ¤",
  256. "yY>","xX#","cC&","vV@","bB{","nN}","mM",",?;",".:·","-_*",
  257. "íÍ<"
  258. };
  259. /*** Polish (programmer's) keyboard layout ***/
  260. private static readonly string [] main_key_PL = new string []
  261. {
  262. "`~","1!","2@","3#","4$","5%","6^","7&§","8*","9(","0)","-_","=+",
  263. "qQ","wW","eEêÊ","rR","tT","yY","uU","iI","oOóÓ","pP","[{","]}",
  264. "aA±¡","sS¶¦","dD","fF","gG","hH","jJ","kK","lL³£",";:","'\"","\\|",
  265. "zZ¿¯","xX¼¬","cCæÆ","vV","bB","nNñÑ","mM",",<",".>","/?",
  266. "<>|"
  267. };
  268. /*** Croatian keyboard layout ***/
  269. private static readonly string [] main_key_HR = new string []
  270. {
  271. "¸¨","1!","2\"·","3#^","4$¢","5%°","6&²","7/`","8(ÿ","9)´","0=½","'?¨","+*¸",
  272. "qQ\\","wW|","eE","rR","tT","zZ","uU","iI","oO","pP","¹©÷","ðÐ×",
  273. "aA","sS","dD","fF[","gG]","hH","jJ","kK³","lL£","èÈ","æÆß","¾®¤",
  274. "yY","xX","cC","vV@","bB{","nN}","mM§",",;",".:","-_/",
  275. "<>"
  276. };
  277. /*** Japanese 106 keyboard layout ***/
  278. private static readonly string [] main_key_JA_jp106 = new string []
  279. {
  280. "1!","2\"","3#","4$","5%","6&","7'","8(","9)","0~","-=","^~","\\|",
  281. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","@`","[{",
  282. "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";+",":*","]}",
  283. "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?",
  284. "\\_",
  285. };
  286. /*** Japanese pc98x1 keyboard layout ***/
  287. private static readonly string [] main_key_JA_pc98x1 = new string []
  288. {
  289. "1!","2\"","3#","4$","5%","6&","7'","8(","9)","0","-=","^`","\\|",
  290. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","@~","[{",
  291. "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";+",":*","]}",
  292. "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?",
  293. "\\_",
  294. };
  295. /*** Brazilian ABNT-2 keyboard layout (contributed by Raul Gomes Fernandes) */
  296. private static readonly string [] main_key_PT_br = new string []
  297. {
  298. "'\"","1!","2@","3#","4$","5%","6\"","7&","8*","9(","0)","-_","=+",
  299. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","'`","[{",
  300. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","çÇ","~^","]}",
  301. "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?"
  302. };
  303. /*** US international keyboard layout (contributed by Gustavo Noronha ([email protected])) */
  304. private static readonly string [] main_key_US_intl = new string []
  305. {
  306. "`~", "1!", "2@", "3#", "4$", "5%", "6^", "7&", "8*", "9(", "0)", "-_", "=+", "\\|",
  307. "qQ", "wW", "eE", "rR", "tT", "yY", "uU", "iI", "oO", "pP", "[{", "]}",
  308. "aA", "sS", "dD", "fF", "gG", "hH", "jJ", "kK", "lL", ";:", "'\"",
  309. "zZ", "xX", "cC", "vV", "bB", "nN", "mM", ",<", ".>", "/?"
  310. };
  311. /*** Slovak keyboard layout (see cssk_ibm(sk_qwerty) in xkbsel)
  312. - dead_abovering replaced with degree - no symbol in iso8859-2
  313. - brokenbar replaced with bar */
  314. private static readonly string [] main_key_SK = new string []
  315. {
  316. ";°`'","+1","µ2","¹3","è4","»5","¾6","ý7","á8","í9","é0)","=%","",
  317. "qQ\\","wW|","eE","rR","tT","yY","uU","iI","oO","pP","ú/÷","ä(×",
  318. "aA","sSð","dDÐ","fF[","gG]","hH","jJ","kK³","lL£","ô\"$","§!ß","ò)¤",
  319. "zZ>","xX#","cC&","vV@","bB{","nN}","mM",",?<",".:>","-_*",
  320. "<>\\|"
  321. };
  322. /*** Slovak and Czech (programmer's) keyboard layout (see cssk_dual(cs_sk_ucw)) */
  323. private static readonly string [] main_key_SK_prog = new string []
  324. {
  325. "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",
  326. "qQäÄ","wWìÌ","eEéÉ","rRøØ","tT»«","yYýÝ","uUùÙ","iIíÍ","oOóÓ","pPöÖ","[{","]}",
  327. "aAáÁ","sS¹©","dDïÏ","fFëË","gGàÀ","hHúÚ","jJüÜ","kKôÔ","lLµ¥",";:","'\"","\\|",
  328. "zZ¾®","xX¤","cCèÈ","vVçÇ","bB","nNòÒ","mMåÅ",",<",".>","/?",
  329. "<>"
  330. };
  331. /*** Czech keyboard layout (see cssk_ibm(cs_qwerty) in xkbsel) */
  332. private static readonly string [] main_key_CS = new string []
  333. {
  334. ";","+1","ì2","¹3","è4","ø5","¾6","ý7","á8","í9","é0½)","=%","",
  335. "qQ\\","wW|","eE","rR","tT","yY","uU","iI","oO","pP","ú/[{",")(]}",
  336. "aA","sSð","dDÐ","fF[","gG]","hH","jJ","kK³","lL£","ù\"$","§!ß","¨'",
  337. "zZ>","xX#","cC&","vV@","bB{","nN}","mM",",?<",".:>","-_*",
  338. "<>\\|"
  339. };
  340. /*** Latin American keyboard layout (contributed by Gabriel Orlando Garcia) */
  341. private static readonly string [] main_key_LA = new string []
  342. {
  343. "|°¬","1!","2\"","3#","4$","5%","6&","7/","8(","9)","0=","'?\\","¡¿",
  344. "qQ@","wW","eE","rR","tT","yY","uU","iI","oO","pP","´¨","+*~",
  345. "aA","sS","dD","fF","gG","hH","jJ","kK","lL","ñÑ","{[^","}]`",
  346. "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
  347. "<>"
  348. };
  349. /*** Lithuanian (Baltic) keyboard layout (contributed by Nerijus Baliûnas) */
  350. private static readonly string [] main_key_LT_B = new string []
  351. {
  352. "`~","àÀ","èÈ","æÆ","ëË","áÁ","ðÐ","øØ","ûÛ","((","))","-_","þÞ",
  353. "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","[{","]}",
  354. "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:","'\"","\\|",
  355. "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?"
  356. };
  357. /*** Turkish keyboard Layout */
  358. private static readonly string [] main_key_TK = new string []
  359. {
  360. "\"é","1!","2'","3^#","4+$","5%","6&","7/{","8([","9)]","0=}","*?\\","-_",
  361. "qQ@","wW","eE","rR","tT","yY","uU","ýIî","oO","pP","ðÐ","üÜ~",
  362. "aAæ","sSß","dD","fF","gG","hH","jJ","kK","lL","þÞ","iÝ",",;`",
  363. "zZ","xX","cC","vV","bB","nN","mM","öÖ","çÇ",".:"
  364. };
  365. private static readonly string [] main_key_vnc = new string []
  366. {
  367. "1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+","[{","]}",";:","'\"","`~",",<",".>","/?","\\|",
  368. "aA","bB","cC","dD","eE","fF","gG","hH","iI","jJ","kK","lL","mM","nN","oO","pP","qQ","rR","sS","tT","uU","vV","wW","xX","yY","zZ"
  369. };
  370. /*** VNC keyboard layout */
  371. private static readonly short [] main_key_scan_vnc = new short []
  372. {
  373. 0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x1A,0x1B,0x27,0x28,0x29,0x33,0x34,0x35,0x2B,
  374. 0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18,0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,
  375. 0x56
  376. };
  377. private static readonly VirtualKeys [] main_key_vkey_vnc = new VirtualKeys []
  378. {
  379. VirtualKeys.VK_1, VirtualKeys.VK_2, VirtualKeys.VK_3, VirtualKeys.VK_4, VirtualKeys.VK_5, VirtualKeys.VK_6,
  380. VirtualKeys.VK_7, VirtualKeys.VK_8, VirtualKeys.VK_9, VirtualKeys.VK_0, VirtualKeys.VK_OEM_MINUS,
  381. VirtualKeys.VK_OEM_PLUS, VirtualKeys.VK_OEM_4, VirtualKeys.VK_OEM_6, VirtualKeys.VK_OEM_1,
  382. VirtualKeys.VK_OEM_7, VirtualKeys.VK_OEM_3, VirtualKeys.VK_OEM_COMMA, VirtualKeys.VK_OEM_PERIOD,
  383. VirtualKeys.VK_OEM_2, VirtualKeys.VK_OEM_5, VirtualKeys.VK_A, VirtualKeys.VK_B, VirtualKeys.VK_C,
  384. VirtualKeys.VK_D, VirtualKeys.VK_E, VirtualKeys.VK_F, VirtualKeys.VK_G, VirtualKeys.VK_H,
  385. VirtualKeys.VK_I, VirtualKeys.VK_J, VirtualKeys.VK_K, VirtualKeys.VK_L, VirtualKeys.VK_M,
  386. VirtualKeys.VK_N, VirtualKeys.VK_O, VirtualKeys.VK_P, VirtualKeys.VK_Q, VirtualKeys.VK_R,
  387. VirtualKeys.VK_S, VirtualKeys.VK_T, VirtualKeys.VK_U, VirtualKeys.VK_V, VirtualKeys.VK_W,
  388. VirtualKeys.VK_X, VirtualKeys.VK_Y, VirtualKeys.VK_Z, VirtualKeys.VK_OEM_102
  389. };
  390. private static readonly short [] main_key_scan_qwerty = new short []
  391. {
  392. /* this is my (102-key) keyboard layout, sorry if it doesn't quite match yours */
  393. /* ` 1 2 3 4 5 6 7 8 9 0 - = */
  394. 0x29,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,
  395. /* q w e r t y u i o p [ ] */
  396. 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,
  397. /* a s d f g h j k l ; ' \ */
  398. 0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x2B,
  399. /* z x c v b n m , . / */
  400. 0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,
  401. 0x56 /* the 102nd key (actually to the right of l-shift) */
  402. };
  403. private static readonly short [] main_key_scan_dvorak = new short []
  404. {
  405. /* ` 1 2 3 4 5 6 7 8 9 0 [ ] */
  406. 0x29,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x1A,0x1B,
  407. /* ' , . p y f g c r l / = */
  408. 0x28,0x33,0x34,0x19,0x15,0x21,0x22,0x2E,0x13,0x26,0x35,0x0D,
  409. /* a o e u i d h t n s - \ */
  410. 0x1E,0x18,0x12,0x16,0x17,0x20,0x23,0x14,0x31,0x1F,0x0C,0x2B,
  411. /* ; q j k x b m w v z */
  412. 0x27,0x10,0x24,0x25,0x2D,0x30,0x32,0x11,0x2F,0x2C,
  413. 0x56 /* the 102nd key (actually to the right of l-shift) */
  414. };
  415. private static readonly VirtualKeys [] main_key_vkey_qwerty = new VirtualKeys []
  416. {
  417. // NOTE: this layout must concur with the scan codes layout above
  418. VirtualKeys.VK_OEM_3, VirtualKeys.VK_1, VirtualKeys.VK_2, VirtualKeys.VK_3, VirtualKeys.VK_4,
  419. VirtualKeys.VK_5, VirtualKeys.VK_6, VirtualKeys.VK_7, VirtualKeys.VK_8, VirtualKeys.VK_9,
  420. VirtualKeys.VK_0, VirtualKeys.VK_OEM_MINUS, VirtualKeys.VK_OEM_PLUS, VirtualKeys.VK_Q,
  421. VirtualKeys.VK_W, VirtualKeys.VK_E, VirtualKeys.VK_R, VirtualKeys.VK_T, VirtualKeys.VK_Y,
  422. VirtualKeys.VK_U, VirtualKeys.VK_I, VirtualKeys.VK_O, VirtualKeys.VK_P, VirtualKeys.VK_OEM_4,
  423. VirtualKeys.VK_OEM_6, VirtualKeys.VK_A, VirtualKeys.VK_S, VirtualKeys.VK_D, VirtualKeys.VK_F,
  424. VirtualKeys.VK_G, VirtualKeys.VK_H, VirtualKeys.VK_J, VirtualKeys.VK_K, VirtualKeys.VK_L,
  425. VirtualKeys.VK_OEM_1, VirtualKeys.VK_OEM_7, VirtualKeys.VK_OEM_5, VirtualKeys.VK_Z,
  426. VirtualKeys.VK_X, VirtualKeys.VK_C, VirtualKeys.VK_V, VirtualKeys.VK_B, VirtualKeys.VK_N,
  427. VirtualKeys.VK_M, VirtualKeys.VK_OEM_COMMA, VirtualKeys.VK_OEM_PERIOD, VirtualKeys.VK_OEM_2,
  428. VirtualKeys.VK_OEM_102 // the 102nd key (actually to the right of l-shift)
  429. };
  430. private static readonly VirtualKeys [] main_key_vkey_dvorak = new VirtualKeys []
  431. {
  432. // NOTE: this layout must concur with the scan codes layout above
  433. VirtualKeys.VK_OEM_3, VirtualKeys.VK_1, VirtualKeys.VK_2, VirtualKeys.VK_3, VirtualKeys.VK_4,
  434. VirtualKeys.VK_5, VirtualKeys.VK_6, VirtualKeys.VK_7, VirtualKeys.VK_8, VirtualKeys.VK_9,
  435. VirtualKeys.VK_0, VirtualKeys.VK_OEM_4, VirtualKeys.VK_OEM_6, VirtualKeys.VK_OEM_7,
  436. VirtualKeys.VK_OEM_COMMA, VirtualKeys.VK_OEM_PERIOD, VirtualKeys.VK_P, VirtualKeys.VK_Y,
  437. VirtualKeys.VK_F, VirtualKeys.VK_G, VirtualKeys.VK_C, VirtualKeys.VK_R, VirtualKeys.VK_L,
  438. VirtualKeys.VK_OEM_2, VirtualKeys.VK_OEM_PLUS, VirtualKeys.VK_A, VirtualKeys.VK_O,
  439. VirtualKeys.VK_E, VirtualKeys.VK_U, VirtualKeys.VK_I, VirtualKeys.VK_D, VirtualKeys.VK_H,
  440. VirtualKeys.VK_T, VirtualKeys.VK_N, VirtualKeys.VK_S, VirtualKeys.VK_OEM_MINUS, VirtualKeys.VK_OEM_5,
  441. VirtualKeys.VK_OEM_1, VirtualKeys.VK_Q, VirtualKeys.VK_J, VirtualKeys.VK_K, VirtualKeys.VK_X,
  442. VirtualKeys.VK_B, VirtualKeys.VK_M, VirtualKeys.VK_W, VirtualKeys.VK_V, VirtualKeys.VK_Z,
  443. VirtualKeys.VK_OEM_102 // the 102nd key (actually to the right of l-shift)
  444. };
  445. private static readonly VirtualKeys [] main_key_vkey_azerty = new VirtualKeys []
  446. {
  447. // NOTE: this layout must concur with the scan codes layout above
  448. VirtualKeys.VK_OEM_7, VirtualKeys.VK_1, VirtualKeys.VK_2, VirtualKeys.VK_3, VirtualKeys.VK_4,
  449. VirtualKeys.VK_5, VirtualKeys.VK_6, VirtualKeys.VK_7, VirtualKeys.VK_8, VirtualKeys.VK_9,
  450. VirtualKeys.VK_0, VirtualKeys.VK_OEM_4, VirtualKeys.VK_OEM_PLUS, VirtualKeys.VK_A, VirtualKeys.VK_Z,
  451. VirtualKeys.VK_E, VirtualKeys.VK_R, VirtualKeys.VK_T, VirtualKeys.VK_Y, VirtualKeys.VK_U,
  452. VirtualKeys.VK_I, VirtualKeys.VK_O, VirtualKeys.VK_P, VirtualKeys.VK_OEM_6, VirtualKeys.VK_OEM_1,
  453. VirtualKeys.VK_Q, VirtualKeys.VK_S, VirtualKeys.VK_D, VirtualKeys.VK_F, VirtualKeys.VK_G,
  454. VirtualKeys.VK_H, VirtualKeys.VK_J, VirtualKeys.VK_K, VirtualKeys.VK_L, VirtualKeys.VK_M,
  455. VirtualKeys.VK_OEM_3, VirtualKeys.VK_OEM_5, VirtualKeys.VK_W, VirtualKeys.VK_X, VirtualKeys.VK_C,
  456. VirtualKeys.VK_V, VirtualKeys.VK_B, VirtualKeys.VK_N, VirtualKeys.VK_OEM_COMMA, VirtualKeys.VK_OEM_PERIOD,
  457. VirtualKeys.VK_OEM_2, VirtualKeys.VK_OEM_8,
  458. VirtualKeys.VK_OEM_102 // the 102nd key (actually to the right of l-shift)
  459. };
  460. public static int [] nonchar_key_vkey = new int []
  461. {
  462. /* unused */
  463. 0, 0, 0, 0, 0, 0, 0, 0, /* FF00 */
  464. /* special keys */
  465. (int) VirtualKeys.VK_BACK, (int) VirtualKeys.VK_TAB, 0, (int) VirtualKeys.VK_CLEAR, 0, (int) VirtualKeys.VK_RETURN, 0, 0, /* FF08 */
  466. 0, 0, 0, (int) VirtualKeys.VK_PAUSE, (int) VirtualKeys.VK_SCROLL, 0, 0, 0, /* FF10 */
  467. 0, 0, 0, (int) VirtualKeys.VK_ESCAPE, 0, 0, 0, 0, /* FF18 */
  468. /* unused */
  469. 0, 0, 0, 0, 0, 0, 0, 0, /* FF20 */
  470. 0, 0, 0, 0, 0, 0, 0, 0, /* FF28 */
  471. 0, 0, 0, 0, 0, 0, 0, 0, /* FF30 */
  472. 0, 0, 0, 0, 0, 0, 0, 0, /* FF38 */
  473. 0, 0, 0, 0, 0, 0, 0, 0, /* FF40 */
  474. 0, 0, 0, 0, 0, 0, 0, 0, /* FF48 */
  475. /* cursor keys */
  476. (int) VirtualKeys.VK_HOME, (int) VirtualKeys.VK_LEFT, (int) VirtualKeys.VK_UP, (int) VirtualKeys.VK_RIGHT, /* FF50 */
  477. (int) VirtualKeys.VK_DOWN, (int) VirtualKeys.VK_PRIOR, (int) VirtualKeys.VK_NEXT, (int) VirtualKeys.VK_END,
  478. 0, 0, 0, 0, 0, 0, 0, 0, /* FF58 */
  479. /* misc keys */
  480. (int) VirtualKeys.VK_SELECT, (int) VirtualKeys.VK_SNAPSHOT, (int) VirtualKeys.VK_EXECUTE, (int) VirtualKeys.VK_INSERT, 0, 0, 0, 0, /* FF60 */
  481. (int) VirtualKeys.VK_CANCEL, (int) VirtualKeys.VK_HELP, (int) VirtualKeys.VK_CANCEL, (int) VirtualKeys.VK_CANCEL, 0, 0, 0, 0, /* FF68 */
  482. 0, 0, 0, 0, 0, 0, 0, 0, /* FF70 */
  483. /* keypad keys */
  484. 0, 0, 0, 0, 0, 0, 0, (int) VirtualKeys.VK_NUMLOCK, /* FF78 */
  485. 0, 0, 0, 0, 0, 0, 0, 0, /* FF80 */
  486. 0, 0, 0, 0, 0, (int) VirtualKeys.VK_RETURN, 0, 0, /* FF88 */
  487. 0, 0, 0, 0, 0, (int) VirtualKeys.VK_HOME, (int) VirtualKeys.VK_LEFT, (int) VirtualKeys.VK_UP, /* FF90 */
  488. (int) VirtualKeys.VK_RIGHT, (int) VirtualKeys.VK_DOWN, (int) VirtualKeys.VK_PRIOR, (int) VirtualKeys.VK_NEXT, /* FF98 */
  489. (int) VirtualKeys.VK_END, 0, (int) VirtualKeys.VK_INSERT, (int) VirtualKeys.VK_DELETE,
  490. 0, 0, 0, 0, 0, 0, 0, 0, /* FFA0 */
  491. 0, 0, (int) VirtualKeys.VK_MULTIPLY, (int) VirtualKeys.VK_ADD, /* FFA8 */
  492. (int) VirtualKeys.VK_SEPARATOR, (int) VirtualKeys.VK_SUBTRACT, (int) VirtualKeys.VK_DECIMAL, (int) VirtualKeys.VK_DIVIDE,
  493. (int) VirtualKeys.VK_NUMPAD0, (int) VirtualKeys.VK_NUMPAD1, (int) VirtualKeys.VK_NUMPAD2, (int) VirtualKeys.VK_NUMPAD3, /* FFB0 */
  494. (int) VirtualKeys.VK_NUMPAD4, (int) VirtualKeys.VK_NUMPAD5, (int) VirtualKeys.VK_NUMPAD6, (int) VirtualKeys.VK_NUMPAD7,
  495. (int) VirtualKeys.VK_NUMPAD8, (int) VirtualKeys.VK_NUMPAD9, 0, 0, 0, 0, /* FFB8 */
  496. /* function keys */
  497. (int) VirtualKeys.VK_F1, (int) VirtualKeys.VK_F2,
  498. (int) VirtualKeys.VK_F3, (int) VirtualKeys.VK_F4, (int) VirtualKeys.VK_F5, (int) VirtualKeys.VK_F6, (int) VirtualKeys.VK_F7, (int) VirtualKeys.VK_F8, (int) VirtualKeys.VK_F9, (int) VirtualKeys.VK_F10, /* FFC0 */
  499. (int) VirtualKeys.VK_F11, (int) VirtualKeys.VK_F12, (int) VirtualKeys.VK_F13, (int) VirtualKeys.VK_F14, (int) VirtualKeys.VK_F15, (int) VirtualKeys.VK_F16, 0, 0, /* FFC8 */
  500. 0, 0, 0, 0, 0, 0, 0, 0, /* FFD0 */
  501. 0, 0, 0, 0, 0, 0, 0, 0, /* FFD8 */
  502. /* modifier keys */
  503. 0, (int) VirtualKeys.VK_SHIFT, (int) VirtualKeys.VK_SHIFT, (int) VirtualKeys.VK_CONTROL, /* FFE0 */
  504. (int) VirtualKeys.VK_CONTROL, (int) VirtualKeys.VK_CAPITAL, 0, (int) VirtualKeys.VK_MENU,
  505. (int) VirtualKeys.VK_MENU, (int) VirtualKeys.VK_MENU, (int) VirtualKeys.VK_MENU, 0, 0, 0, 0, 0, /* FFE8 */
  506. 0, 0, 0, 0, 0, 0, 0, 0, /* FFF0 */
  507. 0, 0, 0, 0, 0, 0, 0, (int) VirtualKeys.VK_DELETE /* FFF8 */
  508. };
  509. public static readonly int [] nonchar_key_scan = new int []
  510. {
  511. /* unused */
  512. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF00 */
  513. /* special keys */
  514. 0x0E, 0x0F, 0x00, /*?*/ 0, 0x00, 0x1C, 0x00, 0x00, /* FF08 */
  515. 0x00, 0x00, 0x00, 0x45, 0x46, 0x00, 0x00, 0x00, /* FF10 */
  516. 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, /* FF18 */
  517. /* unused */
  518. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF20 */
  519. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF28 */
  520. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF30 */
  521. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF38 */
  522. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF40 */
  523. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF48 */
  524. /* cursor keys */
  525. 0x147, 0x14B, 0x148, 0x14D, 0x150, 0x149, 0x151, 0x14F, /* FF50 */
  526. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF58 */
  527. /* misc keys */
  528. /*?*/ 0, 0x137, /*?*/ 0, 0x152, 0x00, 0x00, 0x00, 0x00, /* FF60 */
  529. /*?*/ 0, /*?*/ 0, 0x38, 0x146, 0x00, 0x00, 0x00, 0x00, /* FF68 */
  530. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF70 */
  531. /* keypad keys */
  532. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x138, 0x145, /* FF78 */
  533. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF80 */
  534. 0x00, 0x00, 0x00, 0x00, 0x00, 0x11C, 0x00, 0x00, /* FF88 */
  535. 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x4B, 0x48, /* FF90 */
  536. 0x4D, 0x50, 0x49, 0x51, 0x4F, 0x4C, 0x52, 0x53, /* FF98 */
  537. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FFA0 */
  538. 0x00, 0x00, 0x37, 0x4E, /*?*/ 0, 0x4A, 0x53, 0x135, /* FFA8 */
  539. 0x52, 0x4F, 0x50, 0x51, 0x4B, 0x4C, 0x4D, 0x47, /* FFB0 */
  540. 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, /* FFB8 */
  541. /* function keys */
  542. 0x3B, 0x3C,
  543. 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, /* FFC0 */
  544. 0x57, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FFC8 */
  545. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FFD0 */
  546. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FFD8 */
  547. /* modifier keys */
  548. 0x00, 0x2A, 0x36, 0x1D, 0x11D, 0x3A, 0x00, 0x38, /* FFE0 */
  549. 0x138, 0x38, 0x138, 0x00, 0x00, 0x00, 0x00, 0x00, /* FFE8 */
  550. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FFF0 */
  551. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x153 /* FFF8 */
  552. };
  553. public static readonly KeyboardLayout US = new KeyboardLayout ("United States keyboard layout", 28591,
  554. main_key_US, main_key_scan_qwerty, main_key_vkey_qwerty);
  555. public static readonly KeyboardLayout US_phantom = new KeyboardLayout ("United States keyboard layout (phantom key version)", 28591,
  556. main_key_US_phantom, main_key_scan_qwerty, main_key_vkey_qwerty);
  557. public static readonly KeyboardLayout US_dvorak = new KeyboardLayout ("United States keyboard layout (dvorak)", 28591,
  558. main_key_US_dvorak, main_key_scan_dvorak, main_key_vkey_dvorak);
  559. public static readonly KeyboardLayout UK = new KeyboardLayout ("British keyboard layout", 28591,
  560. main_key_UK, main_key_scan_qwerty, main_key_vkey_qwerty);
  561. public static readonly KeyboardLayout German = new KeyboardLayout ("German keyboard layout", 28591,
  562. main_key_DE, main_key_scan_qwerty, main_key_vkey_qwerty);
  563. public static readonly KeyboardLayout German_nodead = new KeyboardLayout ("German keyboard layout without dead keys", 28591,
  564. main_key_DE_nodead, main_key_scan_qwerty, main_key_vkey_qwerty);
  565. public static readonly KeyboardLayout SwissGerman = new KeyboardLayout ("Swiss German keyboard layout", 28591,
  566. main_key_SG, main_key_scan_qwerty, main_key_vkey_qwerty);
  567. public static readonly KeyboardLayout Se = new KeyboardLayout ("Swedish keyboard layout", 28591,
  568. main_key_SE, main_key_scan_qwerty, main_key_vkey_qwerty);
  569. public static readonly KeyboardLayout No = new KeyboardLayout ("Norwegian keyboard layout", 28591,
  570. main_key_NO, main_key_scan_qwerty, main_key_vkey_qwerty);
  571. public static readonly KeyboardLayout Da = new KeyboardLayout ("Danish keyboard layout", 28591,
  572. main_key_DA, main_key_scan_qwerty, main_key_vkey_qwerty);
  573. public static readonly KeyboardLayout Fr = new KeyboardLayout ("French keyboard layout", 28591,
  574. main_key_FR, main_key_scan_qwerty, main_key_vkey_azerty);
  575. public static readonly KeyboardLayout CF = new KeyboardLayout ("Canadian French keyboard layout", 28591,
  576. main_key_CF, main_key_scan_qwerty, main_key_vkey_qwerty);
  577. public static readonly KeyboardLayout Be = new KeyboardLayout ("Belgian keyboard layout", 28591,
  578. main_key_BE, main_key_scan_qwerty, main_key_vkey_azerty);
  579. public static readonly KeyboardLayout SF = new KeyboardLayout ("Swiss French keyboard layout", 28591,
  580. main_key_SF, main_key_scan_qwerty, main_key_vkey_qwerty);
  581. public static readonly KeyboardLayout Pt = new KeyboardLayout ("Portuguese keyboard layout", 28591,
  582. main_key_PT, main_key_scan_qwerty, main_key_vkey_qwerty);
  583. public static readonly KeyboardLayout Pt_br = new KeyboardLayout ("Brazilian ABNT-2 keyboard layout", 28591,
  584. main_key_PT_br, main_key_scan_qwerty, main_key_vkey_qwerty);
  585. public static readonly KeyboardLayout US_intl = new KeyboardLayout ("United States International keyboard layout", 28591,
  586. main_key_US_intl, main_key_scan_qwerty, main_key_vkey_qwerty);
  587. public static readonly KeyboardLayout Fi = new KeyboardLayout ("Finnish keyboard layout", 28591,
  588. main_key_FI, main_key_scan_qwerty, main_key_vkey_qwerty);
  589. public static readonly KeyboardLayout Ru = new KeyboardLayout ("Russian keyboard layout", 20866,
  590. main_key_RU, main_key_scan_qwerty, main_key_vkey_qwerty);
  591. public static readonly KeyboardLayout Ru_phantom = new KeyboardLayout ("Russian keyboard layout (phantom key version)", 20866,
  592. main_key_RU_phantom, main_key_scan_qwerty, main_key_vkey_qwerty);
  593. public static readonly KeyboardLayout Ru_koi8r = new KeyboardLayout ("Russian keyboard layout KOI8-R", 20866,
  594. main_key_RU_koi8r, main_key_scan_qwerty, main_key_vkey_qwerty);
  595. public static readonly KeyboardLayout Ua = new KeyboardLayout ("Ukrainian keyboard layout KOI8-U", 20866,
  596. main_key_UA, main_key_scan_qwerty, main_key_vkey_qwerty);
  597. public static readonly KeyboardLayout Es = new KeyboardLayout ("Spanish keyboard layout", 28591,
  598. main_key_ES, main_key_scan_qwerty, main_key_vkey_qwerty);
  599. public static readonly KeyboardLayout It = new KeyboardLayout ("Italian keyboard layout", 28591,
  600. main_key_IT, main_key_scan_qwerty, main_key_vkey_qwerty);
  601. public static readonly KeyboardLayout Is = new KeyboardLayout ("Icelandic keyboard layout", 28591,
  602. main_key_IS, main_key_scan_qwerty, main_key_vkey_qwerty);
  603. public static readonly KeyboardLayout Hu = new KeyboardLayout ("Hungarian keyboard layout", 28592,
  604. main_key_HU, main_key_scan_qwerty, main_key_vkey_qwerty);
  605. public static readonly KeyboardLayout Pl = new KeyboardLayout ("Polish (programmer's) keyboard layout", 28592,
  606. main_key_PL, main_key_scan_qwerty, main_key_vkey_qwerty);
  607. public static readonly KeyboardLayout Hr = new KeyboardLayout ("Croatian keyboard layout", 28592,
  608. main_key_HR, main_key_scan_qwerty, main_key_vkey_qwerty);
  609. public static readonly KeyboardLayout Ja_jp106 = new KeyboardLayout ("Japanese 106 keyboard layout", 932,
  610. main_key_JA_jp106, main_key_scan_qwerty, main_key_vkey_qwerty);
  611. public static readonly KeyboardLayout Ja_pc98x1 = new KeyboardLayout ("Japanese pc98x1 keyboard layout", 932,
  612. main_key_JA_pc98x1, main_key_scan_qwerty, main_key_vkey_qwerty);
  613. public static readonly KeyboardLayout Sk = new KeyboardLayout ("Slovak keyboard layout", 28592,
  614. main_key_SK, main_key_scan_qwerty, main_key_vkey_qwerty);
  615. public static readonly KeyboardLayout Sk_prog = new KeyboardLayout ("Slovak and Czech keyboard layout without dead keys", 28592,
  616. main_key_SK_prog, main_key_scan_qwerty, main_key_vkey_qwerty);
  617. public static readonly KeyboardLayout Cz = new KeyboardLayout ("Czech keyboard layout", 28592,
  618. main_key_CS, main_key_scan_qwerty, main_key_vkey_qwerty);
  619. public static readonly KeyboardLayout LA = new KeyboardLayout ("Latin American keyboard layout", 28591,
  620. main_key_LA, main_key_scan_qwerty, main_key_vkey_qwerty);
  621. public static readonly KeyboardLayout LT_B = new KeyboardLayout ("Lithuanian (Baltic) keyboard layout", 28603,
  622. main_key_LT_B, main_key_scan_qwerty, main_key_vkey_qwerty);
  623. public static readonly KeyboardLayout Tk = new KeyboardLayout ("Turkish keyboard layout", 28599,
  624. main_key_TK, main_key_scan_qwerty, main_key_vkey_qwerty);
  625. public static readonly KeyboardLayout Vnc = new KeyboardLayout ("VNC keyboard layout", 28591,
  626. main_key_vnc, main_key_scan_vnc, main_key_vkey_vnc);
  627. public static readonly KeyboardLayout [] layouts = new KeyboardLayout []
  628. {
  629. US, US_phantom, US_dvorak, UK, German, German_nodead, SwissGerman, Se, No, Da, Fr, CF, Be, SF, Pt,
  630. Pt_br, US_intl, Fi, Ru, Ru_phantom, Ru_koi8r, Ua, Es, It, Is, Hu, Pl, Hr, Ja_jp106, Ja_pc98x1, Sk,
  631. Sk_prog, Cz, LA, LT_B, Tk, Vnc
  632. };
  633. public static KeyboardLayout [] Layouts {
  634. get {
  635. return layouts;
  636. }
  637. }
  638. }
  639. }