{ GDlib Keyboard Handler - Keycode-to-Char Conversion Support Gered King, 2020 } {$A+,B-,F-,G+,I-,N+,P-,Q-,R-,S-,T-,V-,X+} unit GDKeyChr; interface uses GDKeybrd; function KeyToChar(k: Key; modifiers: word) : char; implementation const LookupKeyToChar : array[0..127] of char = ( #0, #0, '1', '2', '3', '4', '5', '6', { 00 - 07 } '7', '8', '9', '0', '-', '=', #0, #9, { 08 - 0f } 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', { 10 - 17 } 'o', 'p', '[', ']', #0, #0, 'a', 's', { 18 - 1f } 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', { 20 - 27 } '''', '`', #0, '\', 'z', 'x', 'c', 'v', { 28 - 2f } 'b', 'n', 'm', ',', '.', '/', #0, '*', { 30 - 37 } #0, ' ', #0, #0, #0, #0, #0, #0, { 38 - 3f } #0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 } #0, #0, #0, #0, #0, #0, #0, #0, { 48 - 4f } #0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 } #0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f } #0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 } #0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f } #0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 } #0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f } ); LookupKeyToCharShift : array[0..127] of char = ( #0, #0, '!', '@', '#', '$', '%', '^', { 00 - 07 } '&', '*', '(', ')', '_', '+', #0, #9, { 08 - 0f } 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', { 10 - 17 } 'O', 'P', '{', '}', #0, #0, 'A', 'S', { 18 - 1f } 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', { 20 - 27 } '"', '~', #0, '|', 'Z', 'X', 'C', 'V', { 28 - 2f } 'B', 'N', 'M', '<', '>', '?', #0, '*', { 30 - 37 } #0, ' ', #0, #0, #0, #0, #0, #0, { 38 - 3f } #0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 } #0, #0, #0, #0, #0, #0, #0, #0, { 48 - 4f } #0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 } #0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f } #0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 } #0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f } #0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 } #0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f } ); LookupKeyToCharCaps : array[0..127] of char = ( #0, #0, '1', '2', '3', '4', '5', '6', { 00 - 07 } '7', '8', '9', '0', '-', '=', #0, #9, { 08 - 0f } 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', { 10 - 17 } 'O', 'P', '[', ']', #0, #0, 'A', 'S', { 18 - 1f } 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', { 20 - 27 } '''', '`', #0, '\', 'Z', 'X', 'C', 'V', { 28 - 2f } 'B', 'N', 'M', ',', '.', '/', #0, '*', { 30 - 37 } #0, ' ', #0, #0, #0, #0, #0, #0, { 38 - 3f } #0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 } #0, #0, #0, #0, #0, #0, #0, #0, { 48 - 4f } #0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 } #0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f } #0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 } #0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f } #0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 } #0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f } ); LookupKeyToCharCapsShift : array[0..127] of char = ( #0, #0, '!', '@', '#', '$', '%', '^', { 00 - 07 } '&', '*', '(', ')', '_', '+', #0, #9, { 08 - 0f } 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', { 10 - 17 } 'o', 'p', '{', '}', #0, #0, 'a', 's', { 18 - 1f } 'd', 'f', 'g', 'h', 'j', 'k', 'l', ':', { 20 - 27 } '"', '~', #0, '|', 'z', 'x', 'c', 'v', { 28 - 2f } 'b', 'n', 'm', '<', '>', '?', #0, '*', { 30 - 37 } #0, ' ', #0, #0, #0, #0, #0, #0, { 38 - 3f } #0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 } #0, #0, #0, #0, #0, #0, #0, #0, { 48 - 4f } #0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 } #0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f } #0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 } #0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f } #0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 } #0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f } ); LookupKeyToCharNumpad : array[0..127] of char = ( #0, #0, #0, #0, #0, #0, #0, #0, { 00 - 07 } #0, #0, #0, #0, #0, #0, #0, #0, { 08 - 0f } #0, #0, #0, #0, #0, #0, #0, #0, { 10 - 17 } #0, #0, #0, #0, #0, #0, #0, #0, { 18 - 1f } #0, #0, #0, #0, #0, #0, #0, #0, { 20 - 27 } #0, #0, #0, #0, #0, #0, #0, #0, { 28 - 2f } #0, #0, #0, #0, #0, #0, #0, #0, { 30 - 37 } #0, #0, #0, #0, #0, #0, #0, #0, { 38 - 3f } #0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 } #0, #0, '-', #0, #0, #0, '+', #0, { 48 - 4f } #0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 } #0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f } #0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 } #0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f } #0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 } #0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f } ); LookupKeyToCharNumpadNumlock : array[0..127] of char = ( #0, #0, #0, #0, #0, #0, #0, #0, { 00 - 07 } #0, #0, #0, #0, #0, #0, #0, #0, { 08 - 0f } #0, #0, #0, #0, #0, #0, #0, #0, { 10 - 17 } #0, #0, #0, #0, #0, #0, #0, #0, { 18 - 1f } #0, #0, #0, #0, #0, #0, #0, #0, { 20 - 27 } #0, #0, #0, #0, #0, #0, #0, #0, { 28 - 2f } #0, #0, #0, #0, #0, #0, #0, #0, { 30 - 37 } #0, #0, #0, #0, #0, #0, #0, #0, { 38 - 3f } #0, #0, #0, #0, #0, #0, #0, '7', { 40 - 47 } '8', '9', '-', '4', '5', '6', '+', '1', { 48 - 4f } '2', '3', '0', '.', #0, #0, #0, #0, { 50 - 57 } #0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f } #0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 } #0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f } #0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 } #0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f } ); LookupKeyToCharExtended : array[0..127] of char = ( #0, #0, #0, #0, #0, #0, #0, #0, { 00 - 07 } #0, #0, #0, #0, #0, #0, #0, #0, { 08 - 0f } #0, #0, #0, #0, #0, #0, #0, #0, { 10 - 17 } #0, #0, #0, #0, #0, #0, #0, #0, { 18 - 1f } #0, #0, #0, #0, #0, #0, #0, #0, { 20 - 27 } #0, #0, #0, #0, #0, #0, #0, #0, { 28 - 2f } #0, #0, #0, #0, #0, '/', #0, #0, { 30 - 37 } #0, #0, #0, #0, #0, #0, #0, #0, { 38 - 3f } #0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 } #0, #0, #0, #0, #0, #0, #0, #0, { 48 - 4f } #0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 } #0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f } #0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 } #0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f } #0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 } #0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f } ); function KeyToChar(k: Key; modifiers: word) : char; { returns the equivalent character for the given key scan code and keyboard modifiers (num/caps/scroll lock, shift status, etc.) } begin if (modifiers and KB_MOD_EXTENDED) <> 0 then begin KeyToChar := LookupKeyToCharExtended[k]; end else if (k >= $47) and (k <= $53) then begin { handle numpad keys specially } if (modifiers and KB_MOD_NUM_LOCK) <> 0 then begin if (modifiers and KB_MOD_SHIFT) <> 0 then KeyToChar := LookupKeyToCharNumpad[k] else KeyToChar := LookupKeyToCharNumpadNumLock[k]; end else begin if (modifiers and KB_MOD_SHIFT) <> 0 then KeyToChar := LookupKeyToCharNumpadNumLock[k] else KeyToChar := LookupKeyToCharNumpad[k]; end; end else begin { everything else } if (modifiers and KB_MOD_CAPS_LOCK) <> 0 then begin if (modifiers and KB_MOD_SHIFT) <> 0 then KeyToChar := LookupKeyToCharCapsShift[k] else KeyToChar := LookupKeyToCharCaps[k]; end else begin if (modifiers and KB_MOD_SHIFT) <> 0 then KeyToChar := LookupKeyToCharShift[k] else KeyToChar := LookupKeyToChar[k]; end; end; end; end.