I made a text editor. I was too lazy to study richedit control, so I created my own text field. It is necessary to determine the entered characters in accordance with the selected keyboard layout. Which layout is active can be found out easily. But how to get the right character? The only solution so far is to manually specify the characters, as I did. one

And you need to automatically get the characters of arrayless array

  • 'But how to get the right character?' It is not entirely clear what exactly you mean by this question. In general, the first thing that comes to mind when working with characters is to use ASCII codes. - Shadr
  • "It is necessary to determine the entered characters in accordance with the selected keyboard layout." - sort of clearly written. - user185136

1 answer 1

Taken from the engine irrlicht

HKL KEYBOARD_INPUT_HKL=0; unsigned int KEYBOARD_INPUT_CODEPAGE = 1252; static unsigned int LocaleIdToCodepage(unsigned int lcid) { switch ( lcid ) { case 1098: // Telugu case 1095: // Gujarati case 1094: // Punjabi case 1103: // Sanskrit case 1111: // Konkani case 1114: // Syriac case 1099: // Kannada case 1102: // Marathi case 1125: // Divehi case 1067: // Armenian case 1081: // Hindi case 1079: // Georgian case 1097: // Tamil return 0; case 1054: // Thai return 874; case 1041: // Japanese return 932; case 2052: // Chinese (PRC) case 4100: // Chinese (Singapore) return 936; case 1042: // Korean return 949; case 5124: // Chinese (Macau SAR) case 3076: // Chinese (Hong Kong SAR) case 1028: // Chinese (Taiwan) return 950; case 1048: // Romanian case 1060: // Slovenian case 1038: // Hungarian case 1051: // Slovak case 1045: // Polish case 1052: // Albanian case 2074: // Serbian (Latin) case 1050: // Croatian case 1029: // Czech return 1250; case 1104: // Mongolian (Cyrillic) case 1071: // FYRO Macedonian case 2115: // Uzbek (Cyrillic) case 1058: // Ukrainian case 2092: // Azeri (Cyrillic) case 1092: // Tatar case 1087: // Kazakh case 1059: // Belarusian case 1088: // Kyrgyz (Cyrillic) case 1026: // Bulgarian case 3098: // Serbian (Cyrillic) case 1049: // Russian return 1251; case 8201: // English (Jamaica) case 3084: // French (Canada) case 1036: // French (France) case 5132: // French (Luxembourg) case 5129: // English (New Zealand) case 6153: // English (Ireland) case 1043: // Dutch (Netherlands) case 9225: // English (Caribbean) case 4108: // French (Switzerland) case 4105: // English (Canada) case 1110: // Galician case 10249: // English (Belize) case 3079: // German (Austria) case 6156: // French (Monaco) case 12297: // English (Zimbabwe) case 1069: // Basque case 2067: // Dutch (Belgium) case 2060: // French (Belgium) case 1035: // Finnish case 1080: // Faroese case 1031: // German (Germany) case 3081: // English (Australia) case 1033: // English (United States) case 2057: // English (United Kingdom) case 1027: // Catalan case 11273: // English (Trinidad) case 7177: // English (South Africa) case 1030: // Danish case 13321: // English (Philippines) case 15370: // Spanish (Paraguay) case 9226: // Spanish (Colombia) case 5130: // Spanish (Costa Rica) case 7178: // Spanish (Dominican Republic) case 12298: // Spanish (Ecuador) case 17418: // Spanish (El Salvador) case 4106: // Spanish (Guatemala) case 18442: // Spanish (Honduras) case 3082: // Spanish (International Sort) case 13322: // Spanish (Chile) case 19466: // Spanish (Nicaragua) case 2058: // Spanish (Mexico) case 10250: // Spanish (Peru) case 20490: // Spanish (Puerto Rico) case 1034: // Spanish (Traditional Sort) case 14346: // Spanish (Uruguay) case 8202: // Spanish (Venezuela) case 1089: // Swahili case 1053: // Swedish case 2077: // Swedish (Finland) case 5127: // German (Liechtenstein) case 1078: // Afrikaans case 6154: // Spanish (Panama) case 4103: // German (Luxembourg) case 16394: // Spanish (Bolivia) case 2055: // German (Switzerland) case 1039: // Icelandic case 1057: // Indonesian case 1040: // Italian (Italy) case 2064: // Italian (Switzerland) case 2068: // Norwegian (Nynorsk) case 11274: // Spanish (Argentina) case 1046: // Portuguese (Brazil) case 1044: // Norwegian (Bokmal) case 1086: // Malay (Malaysia) case 2110: // Malay (Brunei Darussalam) case 2070: // Portuguese (Portugal) return 1252; case 1032: // Greek return 1253; case 1091: // Uzbek (Latin) case 1068: // Azeri (Latin) case 1055: // Turkish return 1254; case 1037: // Hebrew return 1255; case 5121: // Arabic (Algeria) case 15361: // Arabic (Bahrain) case 9217: // Arabic (Yemen) case 3073: // Arabic (Egypt) case 2049: // Arabic (Iraq) case 11265: // Arabic (Jordan) case 13313: // Arabic (Kuwait) case 12289: // Arabic (Lebanon) case 4097: // Arabic (Libya) case 6145: // Arabic (Morocco) case 8193: // Arabic (Oman) case 16385: // Arabic (Qatar) case 1025: // Arabic (Saudi Arabia) case 10241: // Arabic (Syria) case 14337: // Arabic (UAE) case 1065: // Farsi case 1056: // Urdu case 7169: // Arabic (Tunisia) return 1256; case 1061: // Estonian case 1062: // Latvian case 1063: // Lithuanian return 1257; case 1066: // Vietnamese return 1258; } return 65001; // utf-8 } 

...

 case WM_SYSKEYDOWN: case WM_SYSKEYUP: case WM_KEYDOWN: case WM_KEYUP: { BYTE allKeys[256]; ... GetKeyboardState(allKeys); WORD keyChars[2]; UINT scanCode = HIWORD(lParam); int conversionResult = ToAsciiEx(wParam,scanCode,allKeys,keyChars,0,KEYBOARD_INPUT_HKL); if( conversionResult == 1 ) { WORD unicodeChar; MultiByteToWideChar( KEYBOARD_INPUT_CODEPAGE, MB_PRECOMPOSED, // default (LPCSTR)keyChars, sizeof(keyChars), (WCHAR*)&unicodeChar, 1 ); wprintf(L"Char [%c]\n",unicodeChar); } }break; case WM_INPUTLANGCHANGE: // get the new codepage used for keyboard input KEYBOARD_INPUT_HKL = GetKeyboardLayout(0); KEYBOARD_INPUT_CODEPAGE = LocaleIdToCodepage( LOWORD(KEYBOARD_INPUT_HKL) ); return 0;