From 70804604de9fcad37e7a471932f89caafb537013 Mon Sep 17 00:00:00 2001 From: red-prig Date: Thu, 20 Oct 2022 23:13:47 +0300 Subject: [PATCH] + --- src/ps4_libsceime.pas | 702 ++++++++++++++++++++++++++++++------------ 1 file changed, 513 insertions(+), 189 deletions(-) diff --git a/src/ps4_libsceime.pas b/src/ps4_libsceime.pas index d7ecb936..558e2f2e 100644 --- a/src/ps4_libsceime.pas +++ b/src/ps4_libsceime.pas @@ -51,7 +51,228 @@ const SCE_IME_ERROR_INVALID_TIMING =-2135162829; // 0x80BC0033 SCE_IME_ERROR_INTERNAL =-2135162625; // 0x80BC00FF + //USB HID USAGE ID + SCE_IME_KEYCODE_NOEVENT =$0000; // No Event + SCE_IME_KEYCODE_ERRORROLLOVER =$0001; // Error Rollover + SCE_IME_KEYCODE_POSTFAIL =$0002; // Pos Fail + SCE_IME_KEYCODE_ERRORUNDEFINED =$0003; // Error Undefined + SCE_IME_KEYCODE_A =$0004; // a and A + SCE_IME_KEYCODE_B =$0005; // b and B + SCE_IME_KEYCODE_C =$0006; // c and C + SCE_IME_KEYCODE_D =$0007; // d and D + SCE_IME_KEYCODE_E =$0008; // e and E + SCE_IME_KEYCODE_F =$0009; // f and F + SCE_IME_KEYCODE_G =$000A; // g and G + SCE_IME_KEYCODE_H =$000B; // h and H + SCE_IME_KEYCODE_I =$000C; // i and I + SCE_IME_KEYCODE_J =$000D; // j and J + SCE_IME_KEYCODE_K =$000E; // k and K + SCE_IME_KEYCODE_L =$000F; // l and L + SCE_IME_KEYCODE_M =$0010; // m and M + SCE_IME_KEYCODE_N =$0011; // n and N + SCE_IME_KEYCODE_O =$0012; // o and O + SCE_IME_KEYCODE_P =$0013; // p and P + SCE_IME_KEYCODE_Q =$0014; // q and Q + SCE_IME_KEYCODE_R =$0015; // r and R + SCE_IME_KEYCODE_S =$0016; // s and S + SCE_IME_KEYCODE_T =$0017; // t and T + SCE_IME_KEYCODE_U =$0018; // u and U + SCE_IME_KEYCODE_V =$0019; // v and V + SCE_IME_KEYCODE_W =$001A; // w and W + SCE_IME_KEYCODE_X =$001B; // x and X + SCE_IME_KEYCODE_Y =$001C; // y and Y + SCE_IME_KEYCODE_Z =$001D; // z and Z + SCE_IME_KEYCODE_1 =$001E; // 1 and ! + SCE_IME_KEYCODE_2 =$001F; // 2 and @ + SCE_IME_KEYCODE_3 =$0020; // 3 and # + SCE_IME_KEYCODE_4 =$0021; // 4 and $ + SCE_IME_KEYCODE_5 =$0022; // 5 and % + SCE_IME_KEYCODE_6 =$0023; // 6 and ^ + SCE_IME_KEYCODE_7 =$0024; // 7 and & + SCE_IME_KEYCODE_8 =$0025; // 8 and * + SCE_IME_KEYCODE_9 =$0026; // 9 and ( + SCE_IME_KEYCODE_0 =$0027; // 0 and ) + SCE_IME_KEYCODE_RETURN =$0028; // Return (Enter) + SCE_IME_KEYCODE_ESCAPE =$0029; // Escape + SCE_IME_KEYCODE_BACKSPACE =$002A; // Delete and Backspace + SCE_IME_KEYCODE_TAB =$002B; // Tab + SCE_IME_KEYCODE_SPACEBAR =$002C; // Spacebar + SCE_IME_KEYCODE_MINUS =$002D; // - and _ + SCE_IME_KEYCODE_EQUAL =$002E; // = and + + SCE_IME_KEYCODE_LEFTBRACKET =$002F; // [ and { + SCE_IME_KEYCODE_RIGHTBRACKET =$0030; // ] and } + SCE_IME_KEYCODE_BACKSLASH =$0031; // \ and | + SCE_IME_KEYCODE_NONUS_POUND =$0032; // Non US # and ~ + SCE_IME_KEYCODE_SEMICOLON =$0033; // ; and : + SCE_IME_KEYCODE_SINGLEQUOTE =$0034; // ' and " + SCE_IME_KEYCODE_BACKQUOTE =$0035; // ` and ~ + SCE_IME_KEYCODE_COMMA =$0036; // , and < + SCE_IME_KEYCODE_PERIOD =$0037; // . and > + SCE_IME_KEYCODE_SLASH =$0038; // / and ? + SCE_IME_KEYCODE_CAPSLOCK =$0039; // Caps Lock + SCE_IME_KEYCODE_F1 =$003A; // F1 + SCE_IME_KEYCODE_F2 =$003B; // F2 + SCE_IME_KEYCODE_F3 =$003C; // F3 + SCE_IME_KEYCODE_F4 =$003D; // F4 + SCE_IME_KEYCODE_F5 =$003E; // F5 + SCE_IME_KEYCODE_F6 =$003F; // F6 + SCE_IME_KEYCODE_F7 =$0040; // F7 + SCE_IME_KEYCODE_F8 =$0041; // F8 + SCE_IME_KEYCODE_F9 =$0042; // F9 + SCE_IME_KEYCODE_F10 =$0043; // F10 + SCE_IME_KEYCODE_F11 =$0044; // F11 + SCE_IME_KEYCODE_F12 =$0045; // F12 + SCE_IME_KEYCODE_PRINTSCREEN =$0046; // Print Screen + SCE_IME_KEYCODE_SCROLLLOCK =$0047; // Scroll Lock + SCE_IME_KEYCODE_PAUSE =$0048; // Break + SCE_IME_KEYCODE_INSERT =$0049; // Insert + SCE_IME_KEYCODE_HOME =$004A; // Home + SCE_IME_KEYCODE_PAGEUP =$004B; // Page Up + SCE_IME_KEYCODE_DELETE =$004C; // Delete Forward + SCE_IME_KEYCODE_END =$004D; // End + SCE_IME_KEYCODE_PAGEDOWN =$004E; // Page Down + SCE_IME_KEYCODE_RIGHTARROW =$004F; // RIght Arrow + SCE_IME_KEYCODE_LEFTARROW =$0050; // Left Arrow + SCE_IME_KEYCODE_DOWNARROW =$0051; // Down Arrow + SCE_IME_KEYCODE_UPARROW =$0052; // Up Arrow + SCE_IME_KEYCODE_KEYPAD_NUMLOCK =$0053; // NumLock and Clear + SCE_IME_KEYCODE_KEYPAD_SLASH =$0054; // Keypad / + SCE_IME_KEYCODE_KEYPAD_ASTERISK =$0055; // Keypad * + SCE_IME_KEYCODE_KEYPAD_MINUS =$0056; // Keypad - + SCE_IME_KEYCODE_KEYPAD_PLUS =$0057; // Keypad + + SCE_IME_KEYCODE_KEYPAD_ENTER =$0058; // Keypad Enter + SCE_IME_KEYCODE_KEYPAD_1 =$0059; // Keypad 1 and End + SCE_IME_KEYCODE_KEYPAD_2 =$005A; // Keypad 2 and Down Arrow + SCE_IME_KEYCODE_KEYPAD_3 =$005B; // Keypad 3 and Page Down + SCE_IME_KEYCODE_KEYPAD_4 =$005C; // Keypad 4 and Left Arrow + SCE_IME_KEYCODE_KEYPAD_5 =$005D; // Keypad 5 + SCE_IME_KEYCODE_KEYPAD_6 =$005E; // Keypad 6 and Right Arrow + SCE_IME_KEYCODE_KEYPAD_7 =$005F; // Keypad 7 and Home + SCE_IME_KEYCODE_KEYPAD_8 =$0060; // Keypad 8 and Up Arrow + SCE_IME_KEYCODE_KEYPAD_9 =$0061; // Keypad 9 and Page Up + SCE_IME_KEYCODE_KEYPAD_0 =$0062; // Keypad 0 and Insert + SCE_IME_KEYCODE_KEYPAD_PERIOD =$0063; // Keypad . and Delete + SCE_IME_KEYCODE_NONUS_BACKSLASH =$0064; // Non US \ and | + SCE_IME_KEYCODE_APPLICATION =$0065; // Application + SCE_IME_KEYCODE_POWER =$0066; // Power + SCE_IME_KEYCODE_KEYPAD_EQUAL =$0067; // Keypad = + SCE_IME_KEYCODE_F13 =$0068; // F13 + SCE_IME_KEYCODE_F14 =$0069; // F14 + SCE_IME_KEYCODE_F15 =$006A; // F15 + SCE_IME_KEYCODE_F16 =$006B; // F16 + SCE_IME_KEYCODE_F17 =$006C; // F17 + SCE_IME_KEYCODE_F18 =$006D; // F18 + SCE_IME_KEYCODE_F19 =$006E; // F19 + SCE_IME_KEYCODE_F20 =$006F; // F20 + SCE_IME_KEYCODE_F21 =$0070; // F21 + SCE_IME_KEYCODE_F22 =$0071; // F22 + SCE_IME_KEYCODE_F23 =$0072; // F23 + SCE_IME_KEYCODE_F24 =$0073; // F24 + SCE_IME_KEYCODE_EXECUTE =$0074; // Execute + SCE_IME_KEYCODE_HELP =$0075; // Help + SCE_IME_KEYCODE_MENU =$0076; // Menu + SCE_IME_KEYCODE_SELECT =$0077; // Select + SCE_IME_KEYCODE_STOP =$0078; // Stop + SCE_IME_KEYCODE_AGAIN =$0079; // Again + SCE_IME_KEYCODE_UNDO =$007A; // Undo + SCE_IME_KEYCODE_CUT =$007B; // Cut + SCE_IME_KEYCODE_COPY =$007C; // Copy + SCE_IME_KEYCODE_PASTE =$007D; // Paste + SCE_IME_KEYCODE_FIND =$007E; // Find + SCE_IME_KEYCODE_MUTE =$007F; // Mute + SCE_IME_KEYCODE_VOLUMEUP =$0080; // Volume Up + SCE_IME_KEYCODE_VOLUMEDOWN =$0081; // Volume Down + SCE_IME_KEYCODE_LOCKING_CAPSLOCK =$0082; // Locking Caps Lock + SCE_IME_KEYCODE_LOCKING_NUMLOCK =$0083; // Locking Num Lock + SCE_IME_KEYCODE_LOCKING_SCROLLLOCK =$0084; // Locking Scroll Lock + SCE_IME_KEYCODE_KEYPAD_COMMA =$0085; // Keypad , + SCE_IME_KEYCODE_KEYPAD_EQUALSIGN =$0086; // Keypad Equal Sign + SCE_IME_KEYCODE_INTERNATIONAL1 =$0087; // International 1 + SCE_IME_KEYCODE_INTERNATIONAL2 =$0088; // International 2 + SCE_IME_KEYCODE_INTERNATIONAL3 =$0089; // International 3 + SCE_IME_KEYCODE_INTERNATIONAL4 =$008A; // International 4 + SCE_IME_KEYCODE_INTERNATIONAL5 =$008B; // International 5 + SCE_IME_KEYCODE_INTERNATIONAL6 =$008C; // International 6 + SCE_IME_KEYCODE_INTERNATIONAL7 =$008D; // International 7 + SCE_IME_KEYCODE_INTERNATIONAL8 =$008E; // International 8 + SCE_IME_KEYCODE_INTERNATIONAL9 =$008F; // International 9 + SCE_IME_KEYCODE_LANG1 =$0090; // Language 1 + SCE_IME_KEYCODE_LANG2 =$0091; // Language 2 + SCE_IME_KEYCODE_LANG3 =$0092; // Language 3 + SCE_IME_KEYCODE_LANG4 =$0093; // Language 4 + SCE_IME_KEYCODE_LANG5 =$0094; // Language 5 + SCE_IME_KEYCODE_LANG6 =$0095; // Language 6 + SCE_IME_KEYCODE_LANG7 =$0096; // Language 7 + SCE_IME_KEYCODE_LANG8 =$0097; // Language 8 + SCE_IME_KEYCODE_LANG9 =$0098; // Language 9 + SCE_IME_KEYCODE_ALTERASE =$0099; // Alternate Erase + SCE_IME_KEYCODE_SYSREQ =$009A; // SysReq / Attention + SCE_IME_KEYCODE_CANCEL =$009B; // Cancel + SCE_IME_KEYCODE_CLEAR =$009C; // Clear + SCE_IME_KEYCODE_PRIOR =$009D; // Prior + SCE_IME_KEYCODE_RETURN2 =$009E; // Return + SCE_IME_KEYCODE_SEPARATOR =$009F; // Separator + SCE_IME_KEYCODE_OUT =$00A0; // Out + SCE_IME_KEYCODE_OPER =$00A1; // Oper + SCE_IME_KEYCODE_CLEAR_AGAIN =$00A2; // Clear/Again + SCE_IME_KEYCODE_CRSEL_PROPS =$00A3; // CrSel/Props + SCE_IME_KEYCODE_EXSEL =$00A4; // ExSel + SCE_IME_KEYCODE_KEYPAD_00 =$00B0; // Keypad 00 + SCE_IME_KEYCODE_KEYPAD_000 =$00B1; // Keypad 000 + SCE_IME_KEYCODE_THOUSANDSSEPARATOR =$00B2; // Thousands Separator + SCE_IME_KEYCODE_DECIMALSEPARATOR =$00B3; // Decimal Separator + SCE_IME_KEYCODE_CURRENCYUNIT =$00B4; // Currency Unit + SCE_IME_KEYCODE_CURRENCYSUBUNIT =$00B5; // Currency Sub-Unit + SCE_IME_KEYCODE_KEYPAD_LEFTPARENTHESIS =$00B6; // Keypad ( + SCE_IME_KEYCODE_KEYPAD_RIGHTPARENTHESIS =$00B7; // Keypad ) + SCE_IME_KEYCODE_KEYPAD_LEFTCURLYBRACKET =$00B8; // Keypad { + SCE_IME_KEYCODE_KEYPAD_RIGHTCURLYBRACKET=$00B9; // Keypad } + SCE_IME_KEYCODE_KEYPAD_TAB =$00BA; // Keypad Tab + SCE_IME_KEYCODE_KEYPAD_BACKSPACE =$00BB; // Keypad BackSpace + SCE_IME_KEYCODE_KEYPAD_A =$00BC; // Keypad A + SCE_IME_KEYCODE_KEYPAD_B =$00BD; // Keypad B + SCE_IME_KEYCODE_KEYPAD_C =$00BE; // Keypad C + SCE_IME_KEYCODE_KEYPAD_D =$00BF; // Keypad D + SCE_IME_KEYCODE_KEYPAD_E =$00C0; // Keypad E + SCE_IME_KEYCODE_KEYPAD_F =$00C1; // Keypad F + SCE_IME_KEYCODE_KEYPAD_XOR =$00C2; // Keypad XOR + SCE_IME_KEYCODE_KEYPAD_HAT =$00C3; // Keypad ^ + SCE_IME_KEYCODE_KEYPAD_PERCENT =$00C4; // Keypad % + SCE_IME_KEYCODE_KEYPAD_LESSTHAN =$00C5; // Keypad < + SCE_IME_KEYCODE_KEYPAD_GREATERTHAN =$00C6; // Keypad > + SCE_IME_KEYCODE_KEYPAD_AND =$00C7; // Keypad & + SCE_IME_KEYCODE_KEYPAD_LOGICALAND =$00C8; // Keypad && + SCE_IME_KEYCODE_KEYPAD_OR =$00C9; // Keypad | + SCE_IME_KEYCODE_KEYPAD_LOGICALOR =$00CA; // Keypad || + SCE_IME_KEYCODE_KEYPAD_COLON =$00CB; // Keypad : + SCE_IME_KEYCODE_KEYPAD_NUMBER =$00CC; // Keypad # + SCE_IME_KEYCODE_KEYPAD_SPACE =$00CD; // Keypad Space + SCE_IME_KEYCODE_KEYPAD_ATSIGN =$00CE; // Keypad @ + SCE_IME_KEYCODE_KEYPAD_EXCLAMATION =$00CF; // Keypad ! + SCE_IME_KEYCODE_KEYPAD_MEMORY_STORE =$00D0; // Keypad Memory Store + SCE_IME_KEYCODE_KEYPAD_MEMORY_RECALL =$00D1; // Keypad Memory Recall + SCE_IME_KEYCODE_KEYPAD_MEMORY_CLEAR =$00D2; // Keypad Memory Clear + SCE_IME_KEYCODE_KEYPAD_MEMORY_ADD =$00D3; // Keypad Memory Add + SCE_IME_KEYCODE_KEYPAD_MEMORY_SUBTRACT =$00D4; // Keypad Memory Subtract + SCE_IME_KEYCODE_KEYPAD_MEMORY_MULTIPLY =$00D5; // Keypad Memory Multiply + SCE_IME_KEYCODE_KEYPAD_MEMORY_DIVIDE =$00D6; // Keypad Memory Divide + SCE_IME_KEYCODE_KEYPAD_PLUS_MINUS =$00D7; // Keypad +/- + SCE_IME_KEYCODE_KEYPAD_CLEAR =$00D8; // Keypad Clear + SCE_IME_KEYCODE_KEYPAD_CLEARENTRY =$00D9; // Keypad Clear Entry + SCE_IME_KEYCODE_KEYPAD_BINARY =$00DA; // Keypad Binary + SCE_IME_KEYCODE_KEYPAD_OCTAL =$00DB; // Keypad Octal + SCE_IME_KEYCODE_KEYPAD_DECIMAL =$00DC; // Keypad Decimal + SCE_IME_KEYCODE_KEYPAD_HEXADECIMAL =$00DD; // Keypad Hexadecimal + SCE_IME_KEYCODE_LEFTCONTROL =$00E0; // Keypad Left Control + SCE_IME_KEYCODE_LEFTSHIFT =$00E1; // Keypad Left Shift + SCE_IME_KEYCODE_LEFTALT =$00E2; // Keypad Left Alt + SCE_IME_KEYCODE_LEFTGUI =$00E3; // Keypad Left Gui + SCE_IME_KEYCODE_RIGHTCONTROL =$00E4; // Keypad Right Control + SCE_IME_KEYCODE_RIGHTSHIFT =$00E5; // Keypad Right Shift + SCE_IME_KEYCODE_RIGHTALT =$00E6; // Keypad Right Alt + SCE_IME_KEYCODE_RIGHTGUI =$00E7; // Keypad Right Gui + //Size of work buffer used by the Ime library SCE_IME_WORK_BUFFER_SIZE=(20*1024); //Various maximum sizes for the IME @@ -306,43 +527,43 @@ const //Keyboard layout types for keyboard devices //SceImeKeyboardType SCE_IME_KEYBOARD_TYPE_NONE = 0; - SCE_IME_KEYBOARD_TYPE_DANISH = 1; - SCE_IME_KEYBOARD_TYPE_GERMAN = 2; - SCE_IME_KEYBOARD_TYPE_GERMAN_SW = 3; - SCE_IME_KEYBOARD_TYPE_ENGLISH_US = 4; - SCE_IME_KEYBOARD_TYPE_ENGLISH_GB = 5; - SCE_IME_KEYBOARD_TYPE_SPANISH = 6; - SCE_IME_KEYBOARD_TYPE_SPANISH_LA = 7; - SCE_IME_KEYBOARD_TYPE_FINNISH = 8; - SCE_IME_KEYBOARD_TYPE_FRENCH = 9; - SCE_IME_KEYBOARD_TYPE_FRENCH_BR = 10; - SCE_IME_KEYBOARD_TYPE_FRENCH_CA = 11; - SCE_IME_KEYBOARD_TYPE_FRENCH_SW = 12; - SCE_IME_KEYBOARD_TYPE_ITALIAN = 13; - SCE_IME_KEYBOARD_TYPE_DUTCH = 14; - SCE_IME_KEYBOARD_TYPE_NORWEGIAN = 15; - SCE_IME_KEYBOARD_TYPE_POLISH = 16; - SCE_IME_KEYBOARD_TYPE_PORTUGUESE_BR = 17; - SCE_IME_KEYBOARD_TYPE_PORTUGUESE_PT = 18; - SCE_IME_KEYBOARD_TYPE_RUSSIAN = 19; - SCE_IME_KEYBOARD_TYPE_SWEDISH = 20; - SCE_IME_KEYBOARD_TYPE_TURKISH = 21; - SCE_IME_KEYBOARD_TYPE_JAPANESE_ROMAN = 22; - SCE_IME_KEYBOARD_TYPE_JAPANESE_KANA = 23; - SCE_IME_KEYBOARD_TYPE_KOREAN = 24; - SCE_IME_KEYBOARD_TYPE_SM_CHINESE = 25; - SCE_IME_KEYBOARD_TYPE_TR_CHINESE_ZY = 26; - SCE_IME_KEYBOARD_TYPE_TR_CHINESE_PY_HK = 27; - SCE_IME_KEYBOARD_TYPE_TR_CHINESE_PY_TW = 28; - SCE_IME_KEYBOARD_TYPE_TR_CHINESE_CG = 29; - SCE_IME_KEYBOARD_TYPE_ARABIC_AR = 30; - SCE_IME_KEYBOARD_TYPE_THAI = 31; - SCE_IME_KEYBOARD_TYPE_CZECH = 32; - SCE_IME_KEYBOARD_TYPE_GREEK = 33; - SCE_IME_KEYBOARD_TYPE_INDONESIAN = 34; - SCE_IME_KEYBOARD_TYPE_VIETNAMESE = 35; - SCE_IME_KEYBOARD_TYPE_ROMANIAN = 36; - SCE_IME_KEYBOARD_TYPE_HUNGARIAN = 37; + SCE_IME_KEYBOARD_TYPE_DANISH = 1; //LANG_DANISH + SCE_IME_KEYBOARD_TYPE_GERMAN = 2; //LANG_GERMAN else + SCE_IME_KEYBOARD_TYPE_GERMAN_SW = 3; //LANG_GERMAN SUBLANG_GERMAN_SWISS + SCE_IME_KEYBOARD_TYPE_ENGLISH_US = 4; //LANG_ENGLISH else + SCE_IME_KEYBOARD_TYPE_ENGLISH_GB = 5; //LANG_ENGLISH SUBLANG_ENGLISH_UK + SCE_IME_KEYBOARD_TYPE_SPANISH = 6; //LANG_SPANISH SUBLANG_SPANISH SUBLANG_SPANISH_MEXICAN SUBLANG_SPANISH_MODERN + SCE_IME_KEYBOARD_TYPE_SPANISH_LA = 7; //LANG_SPANISH else + SCE_IME_KEYBOARD_TYPE_FINNISH = 8; //LANG_FINNISH + SCE_IME_KEYBOARD_TYPE_FRENCH = 9; //LANG_FRENCH else + SCE_IME_KEYBOARD_TYPE_FRENCH_BR = 10; //LANG_FRENCH SUBLANG_FRENCH_BELGIAN + SCE_IME_KEYBOARD_TYPE_FRENCH_CA = 11; //LANG_FRENCH SUBLANG_FRENCH_CANADIAN + SCE_IME_KEYBOARD_TYPE_FRENCH_SW = 12; //LANG_FRENCH SUBLANG_FRENCH_SWISS + SCE_IME_KEYBOARD_TYPE_ITALIAN = 13; //LANG_ITALIAN + SCE_IME_KEYBOARD_TYPE_DUTCH = 14; //LANG_DUTCH + SCE_IME_KEYBOARD_TYPE_NORWEGIAN = 15; //LANG_NORWEGIAN + SCE_IME_KEYBOARD_TYPE_POLISH = 16; //LANG_POLISH + SCE_IME_KEYBOARD_TYPE_PORTUGUESE_BR = 17; //LANG_PORTUGUESE SUBLANG_PORTUGUESE_BRAZILIAN + SCE_IME_KEYBOARD_TYPE_PORTUGUESE_PT = 18; //LANG_PORTUGUESE SUBLANG_PORTUGUESE + SCE_IME_KEYBOARD_TYPE_RUSSIAN = 19; //LANG_RUSSIAN + SCE_IME_KEYBOARD_TYPE_SWEDISH = 20; //LANG_SWEDISH + SCE_IME_KEYBOARD_TYPE_TURKISH = 21; //LANG_TURKISH + SCE_IME_KEYBOARD_TYPE_JAPANESE_ROMAN = 22; //LANG_JAPANESE + SCE_IME_KEYBOARD_TYPE_JAPANESE_KANA = 23; //LANG_JAPANESE ? + SCE_IME_KEYBOARD_TYPE_KOREAN = 24; //LANG_KOREAN + SCE_IME_KEYBOARD_TYPE_SM_CHINESE = 25; //LANG_CHINESE SUBLANG_CHINESE_SIMPLIFIED + SCE_IME_KEYBOARD_TYPE_TR_CHINESE_ZY = 26; //LANG_CHINESE ? + SCE_IME_KEYBOARD_TYPE_TR_CHINESE_PY_HK = 27; //LANG_CHINESE SUBLANG_CHINESE_HONGKONG + SCE_IME_KEYBOARD_TYPE_TR_CHINESE_PY_TW = 28; //LANG_CHINESE ? + SCE_IME_KEYBOARD_TYPE_TR_CHINESE_CG = 29; //LANG_CHINESE else + SCE_IME_KEYBOARD_TYPE_ARABIC_AR = 30; //LANG_ARABIC + SCE_IME_KEYBOARD_TYPE_THAI = 31; //LANG_THAI + SCE_IME_KEYBOARD_TYPE_CZECH = 32; //LANG_CZECH + SCE_IME_KEYBOARD_TYPE_GREEK = 33; //LANG_GREEK + SCE_IME_KEYBOARD_TYPE_INDONESIAN = 34; //LANG_INDONESIAN + SCE_IME_KEYBOARD_TYPE_VIETNAMESE = 35; //LANG_VIETNAMESE + SCE_IME_KEYBOARD_TYPE_ROMANIAN = 36; //LANG_ROMANIAN + SCE_IME_KEYBOARD_TYPE_HUNGARIAN = 37; //LANG_HUNGARIAN //Keyboard device types //SceImeKeyboardDeviceType @@ -534,143 +755,238 @@ end; function scan_code_to_hid(scanCode:Word):Word; begin - Result:=0; + Result:=SCE_IME_KEYCODE_ERRORUNDEFINED; Case scanCode of - $00FF:Result:=$01; // Overrun Error - $00FC:Result:=$02; // POST Fail - $001E:Result:=$04; // a A - $0030:Result:=$05; // b B - $002E:Result:=$06; // c C - $0020:Result:=$07; // d D - $0012:Result:=$08; // e E - $0021:Result:=$09; // f F - $0022:Result:=$0A; // g G - $0023:Result:=$0B; // h H - $0017:Result:=$0C; // i I - $0024:Result:=$0D; // j J - $0025:Result:=$0E; // k K - $0026:Result:=$0F; // l L - $0032:Result:=$10; // m M - $0031:Result:=$11; // n N - $0018:Result:=$12; // o O - $0019:Result:=$13; // p P - $0010:Result:=$14; // q Q - $0013:Result:=$15; // r R - $001F:Result:=$16; // s S - $0014:Result:=$17; // t T - $0016:Result:=$18; // u U - $002F:Result:=$19; // v V - $0011:Result:=$1A; // w W - $002D:Result:=$1B; // x X - $0015:Result:=$1C; // y Y - $002C:Result:=$1D; // z Z - $0002:Result:=$1E; // 1 ! - $0003:Result:=$1F; // 2 @ - $0004:Result:=$20; // 3 # - $0005:Result:=$21; // 4 $ - $0006:Result:=$22; // 5 % - $0007:Result:=$23; // 6 ^ - $0008:Result:=$24; // 7 & - $0009:Result:=$25; // 8 * - $000A:Result:=$26; // 9 ( - $000B:Result:=$27; // 0 ) - $001C:Result:=$28; // Return - $0001:Result:=$29; // Escape - $000E:Result:=$2A; // Backspace - $000F:Result:=$2B; // Tab - $0039:Result:=$2C; // Space - $000C:Result:=$2D; // - _ - $000D:Result:=$2E; // = + - $001A:Result:=$2F; // [ { - $001B:Result:=$30; // ] } - $002B:Result:=$31; // \ | - //$002B:Result:=$32; // Europe 1 (Note 2) - $0027:Result:=$33; // ; : - $0028:Result:=$34; // ' " - $0029:Result:=$35; // ` ~ - $0033:Result:=$36; // , < - $0034:Result:=$37; // . > - $0035:Result:=$38; // / ? - $003A:Result:=$39; // Caps Lock - $003B:Result:=$3A; // F1 - $003C:Result:=$3B; // F2 - $003D:Result:=$3C; // F3 - $003E:Result:=$3D; // F4 - $003F:Result:=$3E; // F5 - $0040:Result:=$3F; // F6 - $0041:Result:=$40; // F7 - $0042:Result:=$41; // F8 - $0043:Result:=$42; // F9 - $0044:Result:=$43; // F10 - $0057:Result:=$44; // F11 - $0058:Result:=$45; // F12 - $0054:Result:=$46; // Print Screen (Note 1) - $E037:Result:=$46; // Print Screen (Note 1) - $0046:Result:=$47; // Scroll Lock - $e046:Result:=$48; // Break (Ctrl + Pause) - $e11d:Result:=$48; // Pause (Ctrl + NumLock) - $E052:Result:=$49; // Insert (Note 1) - $E047:Result:=$4A; // Home (Note 1) - $E049:Result:=$4B; // Page Up (Note 1) - $E053:Result:=$4C; // Delete (Note 1) - $E04F:Result:=$4D; // End (Note 1) - $E051:Result:=$4E; // Page Down (Note 1) - $E04D:Result:=$4F; // Right Arrow (Note 1) - $E04B:Result:=$50; // Left Arrow (Note 1) - $E050:Result:=$51; // Down Arrow (Note 1) - $E048:Result:=$52; // Up Arrow (Note 1) - $0045:Result:=$53; // Num Lock - $E035:Result:=$54; // Keypad / (Note 1) - $0037:Result:=$55; // Keypad * - $004A:Result:=$56; // Keypad - - $004E:Result:=$57; // Keypad + - $E01C:Result:=$58; // Keypad Enter - $004F:Result:=$59; // Keypad 1 End - $0050:Result:=$5A; // Keypad 2 Down - $0051:Result:=$5B; // Keypad 3 PageDn - $004B:Result:=$5C; // Keypad 4 Left - $004C:Result:=$5D; // Keypad 5 - $004D:Result:=$5E; // Keypad 6 Right - $0047:Result:=$5F; // Keypad 7 Home - $0048:Result:=$60; // Keypad 8 Up - $0049:Result:=$61; // Keypad 9 PageUp - $0052:Result:=$62; // Keypad 0 Insert - $0053:Result:=$63; // Keypad . Delete - $0056:Result:=$64; // Europe 2 (Note 2) - $E05D:Result:=$65; // App - $0059:Result:=$67; // Keypad = - $005D:Result:=$68; // F13 - $005E:Result:=$69; // F14 - $005F:Result:=$6A; // F15 - $007E:Result:=$85; // Keypad , (Brazilian Keypad .) - $0073:Result:=$87; // Keyboard Int'l 1 ろ (Ro) - $0070:Result:=$88; // Keyboard Int'l 2 かたかな ひらがな ローマ字 (Katakana/Hiragana) - $007D:Result:=$89; // Keyboard Int'l 3 ¥ (Yen) - $0079:Result:=$8A; // Keyboard Int'l 4 前候補 変換 (次候補) 全候補 (Henkan) - $007B:Result:=$8B; // Keyboard Int'l 5 無変換 (Muhenkan) - $005C:Result:=$8C; // Keyboard Int'l 6 (PC9800 Keypad , ) - $00F2:Result:=$90; // Keyboard Lang 1 한/영 (Hanguel/English) - $00F1:Result:=$91; // Keyboard Lang 2 한자 (Hanja) - $0078:Result:=$92; // Keyboard Lang 3 かたかな (Katakana) - $0077:Result:=$93; // Keyboard Lang 4 ひらがな (Hiragana) - $0076:Result:=$94; // Keyboard Lang 5 半角/全角 (Zenkaku/Hankaku) - $001D:Result:=$E0; // Left Control - $002A:Result:=$E1; // Left Shift - $0038:Result:=$E2; // Left Alt - $E05B:Result:=$E3; // Left GUI - $E01D:Result:=$E4; // Right Control - $0036:Result:=$E5; // Right Shift - $E038:Result:=$E6; // Right Alt - $E05C:Result:=$E7; // Right GUI + $00FF:Result:=SCE_IME_KEYCODE_ERRORROLLOVER; + $00FC:Result:=SCE_IME_KEYCODE_POSTFAIL ; + // + $001E:Result:=SCE_IME_KEYCODE_A; + $0030:Result:=SCE_IME_KEYCODE_B; + $002E:Result:=SCE_IME_KEYCODE_C; + $0020:Result:=SCE_IME_KEYCODE_D; + $0012:Result:=SCE_IME_KEYCODE_E; + $0021:Result:=SCE_IME_KEYCODE_F; + $0022:Result:=SCE_IME_KEYCODE_G; + $0023:Result:=SCE_IME_KEYCODE_H; + $0017:Result:=SCE_IME_KEYCODE_I; + $0024:Result:=SCE_IME_KEYCODE_J; + $0025:Result:=SCE_IME_KEYCODE_K; + $0026:Result:=SCE_IME_KEYCODE_L; + $0032:Result:=SCE_IME_KEYCODE_M; + $0031:Result:=SCE_IME_KEYCODE_N; + $0018:Result:=SCE_IME_KEYCODE_O; + $0019:Result:=SCE_IME_KEYCODE_P; + $0010:Result:=SCE_IME_KEYCODE_Q; + $0013:Result:=SCE_IME_KEYCODE_R; + $001F:Result:=SCE_IME_KEYCODE_S; + $0014:Result:=SCE_IME_KEYCODE_T; + $0016:Result:=SCE_IME_KEYCODE_U; + $002F:Result:=SCE_IME_KEYCODE_V; + $0011:Result:=SCE_IME_KEYCODE_W; + $002D:Result:=SCE_IME_KEYCODE_X; + $0015:Result:=SCE_IME_KEYCODE_Y; + $002C:Result:=SCE_IME_KEYCODE_Z; + $0002:Result:=SCE_IME_KEYCODE_1; + $0003:Result:=SCE_IME_KEYCODE_2; + $0004:Result:=SCE_IME_KEYCODE_3; + $0005:Result:=SCE_IME_KEYCODE_4; + $0006:Result:=SCE_IME_KEYCODE_5; + $0007:Result:=SCE_IME_KEYCODE_6; + $0008:Result:=SCE_IME_KEYCODE_7; + $0009:Result:=SCE_IME_KEYCODE_8; + $000A:Result:=SCE_IME_KEYCODE_9; + $000B:Result:=SCE_IME_KEYCODE_0; + $001C:Result:=SCE_IME_KEYCODE_RETURN; + $0001:Result:=SCE_IME_KEYCODE_ESCAPE; + $000E:Result:=SCE_IME_KEYCODE_BACKSPACE; + $000F:Result:=SCE_IME_KEYCODE_TAB; + $0039:Result:=SCE_IME_KEYCODE_SPACEBAR; + $000C:Result:=SCE_IME_KEYCODE_MINUS; + $000D:Result:=SCE_IME_KEYCODE_EQUAL; + $001A:Result:=SCE_IME_KEYCODE_LEFTBRACKET; + $001B:Result:=SCE_IME_KEYCODE_RIGHTBRACKET; + $002B:Result:=SCE_IME_KEYCODE_BACKSLASH; + // + $0027:Result:=SCE_IME_KEYCODE_SEMICOLON; + $0028:Result:=SCE_IME_KEYCODE_SINGLEQUOTE; + $0029:Result:=SCE_IME_KEYCODE_BACKQUOTE; + $0033:Result:=SCE_IME_KEYCODE_COMMA; + $0034:Result:=SCE_IME_KEYCODE_PERIOD; + $0035:Result:=SCE_IME_KEYCODE_SLASH; + $003A:Result:=SCE_IME_KEYCODE_CAPSLOCK; + $003B:Result:=SCE_IME_KEYCODE_F1; + $003C:Result:=SCE_IME_KEYCODE_F2; + $003D:Result:=SCE_IME_KEYCODE_F3; + $003E:Result:=SCE_IME_KEYCODE_F4; + $003F:Result:=SCE_IME_KEYCODE_F5; + $0040:Result:=SCE_IME_KEYCODE_F6; + $0041:Result:=SCE_IME_KEYCODE_F7; + $0042:Result:=SCE_IME_KEYCODE_F8; + $0043:Result:=SCE_IME_KEYCODE_F9; + $0044:Result:=SCE_IME_KEYCODE_F10; + $0057:Result:=SCE_IME_KEYCODE_F11; + $0058:Result:=SCE_IME_KEYCODE_F12; + $E037, + $0054:Result:=SCE_IME_KEYCODE_PRINTSCREEN; + $0046:Result:=SCE_IME_KEYCODE_SCROLLLOCK; + $E11D, + $E046:Result:=SCE_IME_KEYCODE_PAUSE; + $E052:Result:=SCE_IME_KEYCODE_INSERT; + $E047:Result:=SCE_IME_KEYCODE_HOME; + $E049:Result:=SCE_IME_KEYCODE_PAGEUP; + $E053:Result:=SCE_IME_KEYCODE_DELETE; + $E04F:Result:=SCE_IME_KEYCODE_END; + $E051:Result:=SCE_IME_KEYCODE_PAGEDOWN; + $E04D:Result:=SCE_IME_KEYCODE_RIGHTARROW; + $E04B:Result:=SCE_IME_KEYCODE_LEFTARROW; + $E050:Result:=SCE_IME_KEYCODE_DOWNARROW; + $E048:Result:=SCE_IME_KEYCODE_UPARROW; + $0045:Result:=SCE_IME_KEYCODE_KEYPAD_NUMLOCK; + $E035:Result:=SCE_IME_KEYCODE_KEYPAD_SLASH; + $0037:Result:=SCE_IME_KEYCODE_KEYPAD_ASTERISK; + $004A:Result:=SCE_IME_KEYCODE_KEYPAD_MINUS; + $004E:Result:=SCE_IME_KEYCODE_KEYPAD_PLUS; + $E01C:Result:=SCE_IME_KEYCODE_KEYPAD_ENTER; + $004F:Result:=SCE_IME_KEYCODE_KEYPAD_1; + $0050:Result:=SCE_IME_KEYCODE_KEYPAD_2; + $0051:Result:=SCE_IME_KEYCODE_KEYPAD_3; + $004B:Result:=SCE_IME_KEYCODE_KEYPAD_4; + $004C:Result:=SCE_IME_KEYCODE_KEYPAD_5; + $004D:Result:=SCE_IME_KEYCODE_KEYPAD_6; + $0047:Result:=SCE_IME_KEYCODE_KEYPAD_7; + $0048:Result:=SCE_IME_KEYCODE_KEYPAD_8; + $0049:Result:=SCE_IME_KEYCODE_KEYPAD_9; + $0052:Result:=SCE_IME_KEYCODE_KEYPAD_0; + $0053:Result:=SCE_IME_KEYCODE_KEYPAD_PERIOD; + $0056:Result:=SCE_IME_KEYCODE_NONUS_BACKSLASH; + $E05D:Result:=SCE_IME_KEYCODE_APPLICATION; + $E05E:Result:=SCE_IME_KEYCODE_POWER; + $0059:Result:=SCE_IME_KEYCODE_KEYPAD_EQUAL; + $0064:Result:=SCE_IME_KEYCODE_F13; + $0065:Result:=SCE_IME_KEYCODE_F14; + $0066:Result:=SCE_IME_KEYCODE_F15; + $0067:Result:=SCE_IME_KEYCODE_F16; + $0068:Result:=SCE_IME_KEYCODE_F17; + $0069:Result:=SCE_IME_KEYCODE_F18; + $006A:Result:=SCE_IME_KEYCODE_F19; + $006B:Result:=SCE_IME_KEYCODE_F20; + $006C:Result:=SCE_IME_KEYCODE_F21; + $006D:Result:=SCE_IME_KEYCODE_F22; + $006E:Result:=SCE_IME_KEYCODE_F23; + $006F:Result:=SCE_IME_KEYCODE_F24; + // + $007E:Result:=SCE_IME_KEYCODE_KEYPAD_COMMA; + // + $0073:Result:=SCE_IME_KEYCODE_INTERNATIONAL1; + $0070:Result:=SCE_IME_KEYCODE_INTERNATIONAL2; + $007D:Result:=SCE_IME_KEYCODE_INTERNATIONAL3; + $0079:Result:=SCE_IME_KEYCODE_INTERNATIONAL4; + $007B:Result:=SCE_IME_KEYCODE_INTERNATIONAL5; + $005C:Result:=SCE_IME_KEYCODE_INTERNATIONAL6; + // + $00F2:Result:=SCE_IME_KEYCODE_LANG1; + $00F1:Result:=SCE_IME_KEYCODE_LANG2; + $0078:Result:=SCE_IME_KEYCODE_LANG3; + $0077:Result:=SCE_IME_KEYCODE_LANG4; + $0076:Result:=SCE_IME_KEYCODE_LANG5; + // + $001D:Result:=SCE_IME_KEYCODE_LEFTCONTROL; + $002A:Result:=SCE_IME_KEYCODE_LEFTSHIFT; + $0038:Result:=SCE_IME_KEYCODE_LEFTALT; + $E05B:Result:=SCE_IME_KEYCODE_LEFTGUI; + $E01D:Result:=SCE_IME_KEYCODE_RIGHTCONTROL; + $0036:Result:=SCE_IME_KEYCODE_RIGHTSHIFT; + $E038:Result:=SCE_IME_KEYCODE_RIGHTALT; + $E05C:Result:=SCE_IME_KEYCODE_RIGHTGUI; + else; end; end; +function keyboard_layout_to_type(Layout:HKL):Integer; +begin + Result:=SCE_IME_KEYBOARD_TYPE_NONE; + + Layout:=Layout and $FFFF; + + Case (Layout and $3FF) of + LANG_DANISH:Result:=SCE_IME_KEYBOARD_TYPE_DANISH; + + LANG_GERMAN: + Case (Layout shr 10) of //SUBLANG_* + SUBLANG_GERMAN_SWISS:Result:=SCE_IME_KEYBOARD_TYPE_GERMAN_SW; + else Result:=SCE_IME_KEYBOARD_TYPE_GERMAN; + end; + + LANG_ENGLISH: + Case (Layout shr 10) of //SUBLANG_* + SUBLANG_ENGLISH_UK:Result:=SCE_IME_KEYBOARD_TYPE_ENGLISH_GB; + else Result:=SCE_IME_KEYBOARD_TYPE_ENGLISH_US; + end; + + LANG_SPANISH : + Case (Layout shr 10) of //SUBLANG_* + SUBLANG_SPANISH, + SUBLANG_SPANISH_MEXICAN, + SUBLANG_SPANISH_MODERN:Result:=SCE_IME_KEYBOARD_TYPE_SPANISH; + else + Result:=SCE_IME_KEYBOARD_TYPE_SPANISH_LA; + end; + + LANG_FINNISH:Result:=SCE_IME_KEYBOARD_TYPE_FINNISH; + + LANG_FRENCH: + Case (Layout shr 10) of //SUBLANG_* + SUBLANG_FRENCH_BELGIAN :Result:=SCE_IME_KEYBOARD_TYPE_FRENCH_BR; + SUBLANG_FRENCH_CANADIAN:Result:=SCE_IME_KEYBOARD_TYPE_FRENCH_CA; + SUBLANG_FRENCH_SWISS :Result:=SCE_IME_KEYBOARD_TYPE_FRENCH_SW; + else Result:=SCE_IME_KEYBOARD_TYPE_FRENCH; + end; + + LANG_ITALIAN :Result:=SCE_IME_KEYBOARD_TYPE_ITALIAN; + LANG_DUTCH :Result:=SCE_IME_KEYBOARD_TYPE_DUTCH; + LANG_NORWEGIAN:Result:=SCE_IME_KEYBOARD_TYPE_NORWEGIAN; + LANG_POLISH :Result:=SCE_IME_KEYBOARD_TYPE_POLISH; + + LANG_PORTUGUESE: + Case (Layout shr 10) of //SUBLANG_* + SUBLANG_PORTUGUESE:Result:=SCE_IME_KEYBOARD_TYPE_PORTUGUESE_PT; + else Result:=SCE_IME_KEYBOARD_TYPE_PORTUGUESE_BR; + end; + + LANG_RUSSIAN :Result:=SCE_IME_KEYBOARD_TYPE_RUSSIAN; + LANG_SWEDISH :Result:=SCE_IME_KEYBOARD_TYPE_SWEDISH; + LANG_TURKISH :Result:=SCE_IME_KEYBOARD_TYPE_TURKISH; + LANG_JAPANESE:Result:=SCE_IME_KEYBOARD_TYPE_JAPANESE_ROMAN; + LANG_KOREAN :Result:=SCE_IME_KEYBOARD_TYPE_KOREAN; + + + LANG_CHINESE: + Case (Layout shr 10) of //SUBLANG_* + SUBLANG_CHINESE_SIMPLIFIED:Result:=SCE_IME_KEYBOARD_TYPE_SM_CHINESE; + SUBLANG_CHINESE_HONGKONG :Result:=SCE_IME_KEYBOARD_TYPE_TR_CHINESE_PY_HK + else Result:=SCE_IME_KEYBOARD_TYPE_TR_CHINESE_CG; + end; + + LANG_ARABIC :Result:=SCE_IME_KEYBOARD_TYPE_ARABIC_AR; + LANG_THAI :Result:=SCE_IME_KEYBOARD_TYPE_THAI; + LANG_CZECH :Result:=SCE_IME_KEYBOARD_TYPE_CZECH; + LANG_GREEK :Result:=SCE_IME_KEYBOARD_TYPE_GREEK; + LANG_INDONESIAN:Result:=SCE_IME_KEYBOARD_TYPE_INDONESIAN; + LANG_VIETNAMESE:Result:=SCE_IME_KEYBOARD_TYPE_VIETNAMESE; + LANG_ROMANIAN :Result:=SCE_IME_KEYBOARD_TYPE_ROMANIAN; + LANG_HUNGARIAN :Result:=SCE_IME_KEYBOARD_TYPE_HUNGARIAN; + + else; + end; + +end; + function KeyboardHookCallback(nCode:longint;wParam:WPARAM;lParam:LPARAM):LRESULT; stdcall; var KeyBoardState:TKeyboardState; ActiveThreadID:DWORD; - KeyBoardLayOut:HKL; + KeyBoardLayout:HKL; ScanCode:DWORD; status:DWORD; AChr:array[0..1] of WideChar; @@ -682,10 +998,10 @@ begin KeyBoardState:=Default(TKeyboardState); GetKeyboardState(KeyBoardState); - ActiveThreadID:=GetWindowThreadProcessId(GetForegroundWindow, nil); - KeyBoardLayOut:=GetKeyboardLayout(ActiveThreadID); + ActiveThreadID:=GetWindowThreadProcessId(GetForegroundWindow,nil); + KeyBoardLayout:=GetKeyboardLayout(ActiveThreadID); - ScanCode:=MapVirtualKeyEx(wParam,0,KeyBoardLayOut); + ScanCode:=MapVirtualKeyEx(wParam,0,KeyBoardLayout); status:=0; if (ScanCode<>0) then @@ -693,7 +1009,7 @@ begin status:=status or SCE_IME_KEYCODE_STATE_KEYCODE_VALID; AChr[0]:=#0; AChr[1]:=#0; - ToUnicodeEx(wParam,ScanCode,@KeyBoardState,@AChr,SizeOf(Achr),0,KeyBoardLayOut); + ToUnicodeEx(wParam,ScanCode,@KeyBoardState,@AChr,SizeOf(Achr),0,KeyBoardLayout); if (AChr[0]<>#0) then begin status:=status or SCE_IME_KEYCODE_STATE_CHARACTER_VALID; @@ -711,26 +1027,24 @@ begin end; end; - if ((GetKeyState(VK_CONTROL) and $8000)<>0) then + if ((GetKeyState(VK_LCONTROL) and $8000)<>0) then begin - if ((lParam and (KF_EXTENDED shl 16))=0) then - begin - status:=status or SCE_IME_KEYCODE_STATE_MODIFIER_L_CTRL; - end else - begin - status:=status or SCE_IME_KEYCODE_STATE_MODIFIER_R_CTRL; - end; + status:=status or SCE_IME_KEYCODE_STATE_MODIFIER_L_CTRL; end; - if ((GetKeyState(VK_SHIFT) and $8000)<>0) then + if ((GetKeyState(VK_RCONTROL) and $8000)<>0) then begin - if ((lParam and (KF_EXTENDED shl 16))=0) then - begin - status:=status or SCE_IME_KEYCODE_STATE_MODIFIER_L_SHIFT; - end else - begin - status:=status or SCE_IME_KEYCODE_STATE_MODIFIER_R_SHIFT; - end; + status:=status or SCE_IME_KEYCODE_STATE_MODIFIER_R_CTRL; + end; + + if ((GetKeyState(VK_LSHIFT) and $8000)<>0) then + begin + status:=status or SCE_IME_KEYCODE_STATE_MODIFIER_L_SHIFT; + end; + + if ((GetKeyState(VK_RSHIFT) and $8000)<>0) then + begin + status:=status or SCE_IME_KEYCODE_STATE_MODIFIER_R_SHIFT; end; if ((GetKeyState(VK_LWIN) and $8000)<>0) then @@ -762,7 +1076,7 @@ begin keycode.keycode :=scan_code_to_hid(scanCode); keycode.character :=AChr[0]; keycode.status :=status; - keycode._type :=SCE_IME_KEYBOARD_TYPE_ENGLISH_US; + keycode._type :=keyboard_layout_to_type(KeyBoardLayout); keycode.userId :=-1; keycode.resourceId:=1; GetCurrentTick(@keycode.timestamp); @@ -843,15 +1157,25 @@ begin end; function ps4_sceImeKeyboardGetInfo(resourceId:DWORD;info:pSceImeKeyboardInfo):Integer; SysV_ABI_CDecl; +var + ActiveThreadID:DWORD; + KeyBoardLayout:HKL; begin if (keyboard_init=0) then Exit(SCE_IME_ERROR_NOT_OPENED); if (info=nil) then Exit(SCE_IME_ERROR_INVALID_ADDRESS); + _sig_lock; + + ActiveThreadID:=GetWindowThreadProcessId(GetForegroundWindow,nil); + KeyBoardLayout:=GetKeyboardLayout(ActiveThreadID); + + _sig_unlock; + info^:=Default(SceImeKeyboardInfo); - info^.userId:=-1; - info^.device:=SCE_IME_KEYBOARD_DEVICE_TYPE_KEYBOARD; - info^._type :=SCE_IME_KEYBOARD_TYPE_ENGLISH_US; + info^.userId :=-1; + info^.device :=SCE_IME_KEYBOARD_DEVICE_TYPE_KEYBOARD; + info^._type :=keyboard_layout_to_type(KeyBoardLayout); info^.repeatDelay:=1; info^.repeatRate :=1; info^.status :=CE_IME_KEYBOARD_STATE_CONNECTED;