spiegel-keyman/common/windows/delphi/general/VKeys.pas

907 lines
18 KiB
ObjectPascal

(*
Name: VKeys
Copyright: Copyright (C) SIL International.
Documentation:
Description:
Create Date: 19 Mar 2007
Modified Date: 19 Mar 2014
Authors: mcdurdin
Related Files:
Dependencies:
Bugs:
Todo:
Notes:
History: 19 Mar 2007 - mcdurdin - I698 - Fix non matching of K_oE2 (due to case mismatch)
19 Mar 2014 - mcdurdin - I4141 - V9.0 - Warn when unusable key ids are used
19 Mar 2014 - mcdurdin - I4142 - V9.0 - Validate key ids are in an acceptable format
*)
unit VKeys;
interface
function FindVKeyName(const txt: string): Word;
const VKeyNames: array[0..255] of string = (
'K_?00', // &H0
'K_LBUTTON', // &H1
'K_RBUTTON', // &H2
'K_CANCEL', // &H3
'K_MBUTTON', // &H4
'K_?05', // &H5
'K_?06', // &H6
'K_?07', // &H7
'K_BKSP', // &H8
'K_TAB', // &H9
'K_?0A', // &HA
'K_?0B', // &HB
'K_KP5', // &HC
'K_ENTER', // &HD
'K_?0E', // &HE
'K_?0F', // &HF
'K_SHIFT', // &H10
'K_CONTROL', // &H11
'K_ALT', // &H12
'K_PAUSE', // &H13
'K_CAPS', // &H14
'K_KANJI?15', // &H15
'K_KANJI?16', // &H16
'K_KANJI?17', // &H17
'K_KANJI?18', // &H18
'K_KANJI?19', // &H19
'K_?1A', // &H1A
'K_ESC', // &H1B
'K_KANJI?1C', // &H1C
'K_KANJI?1D', // &H1D
'K_KANJI?1E', // &H1E
'K_KANJI?1F', // &H1F
'K_SPACE', // &H20
'K_PGUP', // &H21
'K_PGDN', // &H22
'K_END', // &H23
'K_HOME', // &H24
'K_LEFT', // &H25
'K_UP', // &H26
'K_RIGHT', // &H27
'K_DOWN', // &H28
'K_SEL', // &H29
'K_PRINT', // &H2A
'K_EXEC', // &H2B
'K_PRTSCN', // &H2C
'K_INS', // &H2D
'K_DEL', // &H2E
'K_HELP', // &H2F
'K_0', // &H30
'K_1', // &H31
'K_2', // &H32
'K_3', // &H33
'K_4', // &H34
'K_5', // &H35
'K_6', // &H36
'K_7', // &H37
'K_8', // &H38
'K_9', // &H39
'K_?3A', // &H3A
'K_?3B', // &H3B
'K_?3C', // &H3C
'K_?3D', // &H3D
'K_?3E', // &H3E
'K_?3F', // &H3F
'K_?40', // &H40
'K_A', // &H41
'K_B', // &H42
'K_C', // &H43
'K_D', // &H44
'K_E', // &H45
'K_F', // &H46
'K_G', // &H47
'K_H', // &H48
'K_I', // &H49
'K_J', // &H4A
'K_K', // &H4B
'K_L', // &H4C
'K_M', // &H4D
'K_N', // &H4E
'K_O', // &H4F
'K_P', // &H50
'K_Q', // &H51
'K_R', // &H52
'K_S', // &H53
'K_T', // &H54
'K_U', // &H55
'K_V', // &H56
'K_W', // &H57
'K_X', // &H58
'K_Y', // &H59
'K_Z', // &H5A
'K_?5B', // &H5B
'K_?5C', // &H5C
'K_?5D', // &H5D
'K_?5E', // &H5E
'K_?5F', // &H5F
'K_NP0', // &H60
'K_NP1', // &H61
'K_NP2', // &H62
'K_NP3', // &H63
'K_NP4', // &H64
'K_NP5', // &H65
'K_NP6', // &H66
'K_NP7', // &H67
'K_NP8', // &H68
'K_NP9', // &H69
'K_NPSTAR', // &H6A
'K_NPPLUS', // &H6B
'K_SEPARATOR', // &H6C
'K_NPMINUS', // &H6D
'K_NPDOT', // &H6E
'K_NPSLASH', // &H6F
'K_F1', // &H70
'K_F2', // &H71
'K_F3', // &H72
'K_F4', // &H73
'K_F5', // &H74
'K_F6', // &H75
'K_F7', // &H76
'K_F8', // &H77
'K_F9', // &H78
'K_F10', // &H79
'K_F11', // &H7A
'K_F12', // &H7B
'K_F13', // &H7C
'K_F14', // &H7D
'K_F15', // &H7E
'K_F16', // &H7F
'K_F17', // &H80
'K_F18', // &H81
'K_F19', // &H82
'K_F20', // &H83
'K_F21', // &H84
'K_F22', // &H85
'K_F23', // &H86
'K_F24', // &H87
'K_?88', // &H88
'K_?89', // &H89
'K_?8A', // &H8A
'K_?8B', // &H8B
'K_?8C', // &H8C
'K_?8D', // &H8D
'K_?8E', // &H8E
'K_?8F', // &H8F
'K_NUMLOCK', // &H90
'K_SCROLL', // &H91
'K_?92', // &H92
'K_?93', // &H93
'K_?94', // &H94
'K_?95', // &H95
'K_?96', // &H96
'K_?97', // &H97
'K_?98', // &H98
'K_?99', // &H99
'K_?9A', // &H9A
'K_?9B', // &H9B
'K_?9C', // &H9C
'K_?9D', // &H9D
'K_?9E', // &H9E
'K_?9F', // &H9F
'K_?A0', // &HA0
'K_?A1', // &HA1
'K_?A2', // &HA2
'K_?A3', // &HA3
'K_?A4', // &HA4
'K_?A5', // &HA5
'K_?A6', // &HA6
'K_?A7', // &HA7
'K_?A8', // &HA8
'K_?A9', // &HA9
'K_?AA', // &HAA
'K_?AB', // &HAB
'K_?AC', // &HAC
'K_?AD', // &HAD
'K_?AE', // &HAE
'K_?AF', // &HAF
'K_?B0', // &HB0
'K_?B1', // &HB1
'K_?B2', // &HB2
'K_?B3', // &HB3
'K_?B4', // &HB4
'K_?B5', // &HB5
'K_?B6', // &HB6
'K_?B7', // &HB7
'K_?B8', // &HB8
'K_?B9', // &HB9
'K_COLON', // &HBA
'K_EQUAL', // &HBB
'K_COMMA', // &HBC
'K_HYPHEN', // &HBD
'K_PERIOD', // &HBE
'K_SLASH', // &HBF
'K_BKQUOTE', // &HC0
'K_?C1', // &HC1
'K_?C2', // &HC2
'K_?C3', // &HC3
'K_?C4', // &HC4
'K_?C5', // &HC5
'K_?C6', // &HC6
'K_?C7', // &HC7
'K_?C8', // &HC8
'K_?C9', // &HC9
'K_?CA', // &HCA
'K_?CB', // &HCB
'K_?CC', // &HCC
'K_?CD', // &HCD
'K_?CE', // &HCE
'K_?CF', // &HCF
'K_?D0', // &HD0
'K_?D1', // &HD1
'K_?D2', // &HD2
'K_?D3', // &HD3
'K_?D4', // &HD4
'K_?D5', // &HD5
'K_?D6', // &HD6
'K_?D7', // &HD7
'K_?D8', // &HD8
'K_?D9', // &HD9
'K_?DA', // &HDA
'K_LBRKT', // &HDB
'K_BKSLASH', // &HDC
'K_RBRKT', // &HDD
'K_QUOTE', // &HDE
'K_oDF', // &HDF
'K_oE0', // &HE0
'K_oE1', // &HE1
'K_oE2', // &HE2
'K_oE3', // &HE3
'K_oE4', // &HE4
'K_?E5', // &HE5
'K_oE6', // &HE6
'K_?E7', // &HE7
'K_?E8', // &HE8
'K_oE9', // &HE9
'K_oEA', // &HEA
'K_oEB', // &HEB
'K_oEC', // &HEC
'K_oED', // &HED
'K_oEE', // &HEE
'K_oEF', // &HEF
'K_oF0', // &HF0
'K_oF1', // &HF1
'K_oF2', // &HF2
'K_oF3', // &HF3
'K_oF4', // &HF4
'K_oF5', // &HF5
'K_?F6', // &HF6
'K_?F7', // &HF7
'K_?F8', // &HF8
'K_?F9', // &HF9
'K_?FA', // &HFA
'K_?FB', // &HFB
'K_?FC', // &HFC
'K_?FD', // &HFD
'K_?FE', // &HFE
'K_?FF'); // &HFF
///
/// Virtual key names used in KeymanWeb. Blanks indicate a
/// virtual key that is not recognised by KeymanWeb.
///
const KMWVKeyNames: array[0..255] of string = (
'',
'',
'',
'',
'',
'',
'',
'',
'K_BKSP',
'K_TAB',
'',
'',
'',
'K_ENTER',
'',
'',
'K_SHIFT',
'K_CONTROL',
'K_ALT',
'K_PAUSE',
'K_CAPS',
'',
'',
'',
'',
'',
'',
'K_ESC',
'',
'',
'',
'',
'K_SPACE',
'K_PGUP',
'K_PGDN',
'K_END',
'K_HOME',
'K_LEFT',
'K_UP',
'K_RIGHT',
'K_DOWN',
'K_SEL',
'K_PRINT',
'K_EXEC',
'',
'K_INS',
'K_DEL',
'K_HELP',
'K_0',
'K_1',
'K_2',
'K_3',
'K_4',
'K_5',
'K_6',
'K_7',
'K_8',
'K_9',
'',
'',
'',
'',
'',
'',
'',
'K_A',
'K_B',
'K_C',
'K_D',
'K_E',
'K_F',
'K_G',
'K_H',
'K_I',
'K_J',
'K_K',
'K_L',
'K_M',
'K_N',
'K_O',
'K_P',
'K_Q',
'K_R',
'K_S',
'K_T',
'K_U',
'K_V',
'K_W',
'K_X',
'K_Y',
'K_Z',
'',
'',
'',
'',
'',
'K_NP0',
'K_NP1',
'K_NP2',
'K_NP3',
'K_NP4',
'K_NP5',
'K_NP6',
'K_NP7',
'K_NP8',
'K_NP9',
'K_NPSTAR',
'K_NPPLUS',
'K_SEPARATOR',
'K_NPMINUS',
'K_NPDOT',
'K_NPSLASH',
'K_F1',
'K_F2',
'K_F3',
'K_F4',
'K_F5',
'K_F6',
'K_F7',
'K_F8',
'K_F9',
'K_F10',
'K_F11',
'K_F12',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'K_NUMLOCK',
'K_SCROLL',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'K_LSHIFT',
'K_RSHIFT',
'K_LCONTROL',
'K_RCONTROL',
'K_LALT',
'K_RALT',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'K_COLON',
'K_EQUAL',
'K_COMMA',
'K_HYPHEN',
'K_PERIOD',
'K_SLASH',
'K_BKQUOTE',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'K_LBRKT',
'K_BKSLASH',
'K_RBRKT',
'K_QUOTE',
'',
'',
'',
'K_oE2',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
''
);
const VKeyISO9995Names: array[0..255] of string = (
// Key Codes
'', // 'K_?00', // &H0
'', // 'K_LBUTTON', // &H1
'', // 'K_RBUTTON', // &H2
'', // 'K_CANCEL', // &H3
'', // 'K_MBUTTON', // &H4
'', // 'K_?05', // &H5
'', // 'K_?06', // &H6
'', // 'K_?07', // &H7
'E14', // 'K_BKSP', // &H8
'D00', // 'K_TAB', // &H9
'', // 'K_?0A', // &HA
'', // 'K_?0B', // &HB
'', // 'K_KP5', // &HC
'C13', // 'K_ENTER', // &HD
'', // 'K_?0E', // &HE
'', // 'K_?0F', // &HF
'B99', // 'K_SHIFT', // &H10
'A99', // 'K_CONTROL', // &H11
'A02', // 'K_ALT', // &H12
'', // 'K_PAUSE', // &H13
'C00', // 'K_CAPS', // &H14
'', // 'K_KANJI?15', // &H15
'', // 'K_KANJI?16', // &H16
'', // 'K_KANJI?17', // &H17
'', // 'K_KANJI?18', // &H18
'', // 'K_KANJI?19', // &H19
'', // 'K_?1A', // &H1A
'', // 'K_ESC', // &H1B
'', // 'K_KANJI?1C', // &H1C
'', // 'K_KANJI?1D', // &H1D
'', // 'K_KANJI?1E', // &H1E
'', // 'K_KANJI?1F', // &H1F
'A03', // 'K_SPACE', // &H20
'', // 'K_PGUP', // &H21
'', // 'K_PGDN', // &H22
'', // 'K_END', // &H23
'', // 'K_HOME', // &H24
'', // 'K_LEFT', // &H25
'', // 'K_UP', // &H26
'', // 'K_RIGHT', // &H27
'', // 'K_DOWN', // &H28
'', // 'K_SEL', // &H29
'', // 'K_PRINT', // &H2A
'', // 'K_EXEC', // &H2B
'', // 'K_PRTSCN', // &H2C
'', // 'K_INS', // &H2D
'', // 'K_DEL', // &H2E
'', // 'K_HELP', // &H2F
'E10', // 'K_0', // &H30
'E01', // 'K_1', // &H31
'E02', // 'K_2', // &H32
'E03', // 'K_3', // &H33
'E04', // 'K_4', // &H34
'E05', // 'K_5', // &H35
'E06', // 'K_6', // &H36
'E07', // 'K_7', // &H37
'E08', // 'K_8', // &H38
'E09', // 'K_9', // &H39
'', // 'K_?3A', // &H3A
'', // 'K_?3B', // &H3B
'', // 'K_?3C', // &H3C
'', // 'K_?3D', // &H3D
'', // 'K_?3E', // &H3E
'', // 'K_?3F', // &H3F
'', // 'K_?40', // &H40
'C01', // 'K_A', // &H41
'B05', // 'K_B', // &H42
'B03', // 'K_C', // &H43
'C03', // 'K_D', // &H44
'D03', // 'K_E', // &H45
'C04', // 'K_F', // &H46
'C05', // 'K_G', // &H47
'C06', // 'K_H', // &H48
'D08', // 'K_I', // &H49
'C07', // 'K_J', // &H4A
'C08', // 'K_K', // &H4B
'C09', // 'K_L', // &H4C
'B07', // 'K_M', // &H4D
'B06', // 'K_N', // &H4E
'D09', // 'K_O', // &H4F
'D10', // 'K_P', // &H50
'D01', // 'K_Q', // &H51
'D04', // 'K_R', // &H52
'C02', // 'K_S', // &H53
'D05', // 'K_T', // &H54
'D07', // 'K_U', // &H55
'B04', // 'K_V', // &H56
'D02', // 'K_W', // &H57
'B02', // 'K_X', // &H58
'D06', // 'K_Y', // &H59
'B01', // 'K_Z', // &H5A
'', // 'K_?5B', // &H5B
'', // 'K_?5C', // &H5C
'', // 'K_?5D', // &H5D
'', // 'K_?5E', // &H5E
'', // 'K_?5F', // &H5F
'', // 'K_NP0', // &H60
'', // 'K_NP1', // &H61
'', // 'K_NP2', // &H62
'', // 'K_NP3', // &H63
'', // 'K_NP4', // &H64
'', // 'K_NP5', // &H65
'', // 'K_NP6', // &H66
'', // 'K_NP7', // &H67
'', // 'K_NP8', // &H68
'', // 'K_NP9', // &H69
'', // 'K_NPSTAR', // &H6A
'', // 'K_NPPLUS', // &H6B
'', // 'K_SEPARATOR', // &H6C
'', // 'K_NPMINUS', // &H6D
'', // 'K_NPDOT', // &H6E
'', // 'K_NPSLASH', // &H6F
'', // 'K_F1', // &H70
'', // 'K_F2', // &H71
'', // 'K_F3', // &H72
'', // 'K_F4', // &H73
'', // 'K_F5', // &H74
'', // 'K_F6', // &H75
'', // 'K_F7', // &H76
'', // 'K_F8', // &H77
'', // 'K_F9', // &H78
'', // 'K_F10', // &H79
'', // 'K_F11', // &H7A
'', // 'K_F12', // &H7B
'', // 'K_F13', // &H7C
'', // 'K_F14', // &H7D
'', // 'K_F15', // &H7E
'', // 'K_F16', // &H7F
'', // 'K_F17', // &H80
'', // 'K_F18', // &H81
'', // 'K_F19', // &H82
'', // 'K_F20', // &H83
'', // 'K_F21', // &H84
'', // 'K_F22', // &H85
'', // 'K_F23', // &H86
'', // 'K_F24', // &H87
'', // 'K_?88', // &H88
'', // 'K_?89', // &H89
'', // 'K_?8A', // &H8A
'', // 'K_?8B', // &H8B
'', // 'K_?8C', // &H8C
'', // 'K_?8D', // &H8D
'', // 'K_?8E', // &H8E
'', // 'K_?8F', // &H8F
'', // 'K_NUMLOCK', // &H90
'', // 'K_SCROLL', // &H91
'', // 'K_?92', // &H92
'', // 'K_?93', // &H93
'', // 'K_?94', // &H94
'', // 'K_?95', // &H95
'', // 'K_?96', // &H96
'', // 'K_?97', // &H97
'', // 'K_?98', // &H98
'', // 'K_?99', // &H99
'', // 'K_?9A', // &H9A
'', // 'K_?9B', // &H9B
'', // 'K_?9C', // &H9C
'', // 'K_?9D', // &H9D
'', // 'K_?9E', // &H9E
'', // 'K_?9F', // &H9F
'', // 'K_?A0', // &HA0
'', // 'K_?A1', // &HA1
'', // 'K_?A2', // &HA2
'', // 'K_?A3', // &HA3
'', // 'K_?A4', // &HA4
'', // 'K_?A5', // &HA5
'', // 'K_?A6', // &HA6
'', // 'K_?A7', // &HA7
'', // 'K_?A8', // &HA8
'', // 'K_?A9', // &HA9
'', // 'K_?AA', // &HAA
'', // 'K_?AB', // &HAB
'', // 'K_?AC', // &HAC
'', // 'K_?AD', // &HAD
'', // 'K_?AE', // &HAE
'', // 'K_?AF', // &HAF
'', // 'K_?B0', // &HB0
'', // 'K_?B1', // &HB1
'', // 'K_?B2', // &HB2
'', // 'K_?B3', // &HB3
'', // 'K_?B4', // &HB4
'', // 'K_?B5', // &HB5
'', // 'K_?B6', // &HB6
'', // 'K_?B7', // &HB7
'', // 'K_?B8', // &HB8
'', // 'K_?B9', // &HB9
'C10', // 'K_COLON', // &HBA
'E12', // 'K_EQUAL', // &HBB
'B08', // 'K_COMMA', // &HBC
'E11', // 'K_HYPHEN', // &HBD
'B09', // 'K_PERIOD', // &HBE
'B10', // 'K_SLASH', // &HBF
'E00', // 'K_BKQUOTE', // &HC0
'', // 'K_?C1', // &HC1
'', // 'K_?C2', // &HC2
'', // 'K_?C3', // &HC3
'', // 'K_?C4', // &HC4
'', // 'K_?C5', // &HC5
'', // 'K_?C6', // &HC6
'', // 'K_?C7', // &HC7
'', // 'K_?C8', // &HC8
'', // 'K_?C9', // &HC9
'', // 'K_?CA', // &HCA
'', // 'K_?CB', // &HCB
'', // 'K_?CC', // &HCC
'', // 'K_?CD', // &HCD
'', // 'K_?CE', // &HCE
'', // 'K_?CF', // &HCF
'', // 'K_?D0', // &HD0
'', // 'K_?D1', // &HD1
'', // 'K_?D2', // &HD2
'', // 'K_?D3', // &HD3
'', // 'K_?D4', // &HD4
'', // 'K_?D5', // &HD5
'', // 'K_?D6', // &HD6
'', // 'K_?D7', // &HD7
'', // 'K_?D8', // &HD8
'', // 'K_?D9', // &HD9
'', // 'K_?DA', // &HDA
'D11', // 'K_LBRKT', // &HDB
'D13', // 'K_BKSLASH', // &HDC
'D12', // 'K_RBRKT', // &HDD
'C11', // 'K_QUOTE', // &HDE
'', // 'K_oDF', // &HDF
'', // 'K_oE0', // &HE0
'', // 'K_oE1', // &HE1
'B00', // 'K_oE2', // &HE2
'', // 'K_oE3', // &HE3
'', // 'K_oE4', // &HE4
'', // 'K_?E5', // &HE5
'', // 'K_oE6', // &HE6
'', // 'K_?E7', // &HE7
'', // 'K_?E8', // &HE8
'', // 'K_oE9', // &HE9
'', // 'K_oEA', // &HEA
'', // 'K_oEB', // &HEB
'', // 'K_oEC', // &HEC
'', // 'K_oED', // &HED
'', // 'K_oEE', // &HEE
'', // 'K_oEF', // &HEF
'', // 'K_oF0', // &HF0
'', // 'K_oF1', // &HF1
'', // 'K_oF2', // &HF2
'', // 'K_oF3', // &HF3
'', // 'K_oF4', // &HF4
'', // 'K_oF5', // &HF5
'', // 'K_?F6', // &HF6
'', // 'K_?F7', // &HF7
'', // 'K_?F8', // &HF8
'', // 'K_?F9', // &HF9
'', // 'K_?FA', // &HFA
'', // 'K_?FB', // &HFB
'', // 'K_?FC', // &HFC
'', // 'K_?FD', // &HFD
'', // 'K_?FE', // &HFE
'' // 'K_?FF' // &HFF
);
type
TKeyNameRecord = record // I4141 // I4142
Name: string;
Code: Integer;
end;
const
{ Used only by KMW }
AdditionalKeyNames: array[0..3] of TKeyNameRecord = (
(Name: 'K_LCONTROL'; Code: $A2),
(Name: 'K_RCONTROL'; Code: $A3),
(Name: 'K_LALT'; Code: $A4),
(Name: 'K_RALT'; Code: $A5)
);
type
TKeymanWebTouchStandardKey = (
K_LOPT = 50001,
K_ROPT = 50002,
K_NUMERALS = 50003,
K_SYMBOLS = 50004,
K_CURRENCIES = 50005,
K_UPPER = 50006,
K_LOWER = 50007,
K_ALPHA = 50008,
K_SHIFTED = 50009,
K_ALTGR = 50010,
K_TABBACK = 50011,
K_TABFWD = 50012);
const
KeymanWebTouchStandardKeys: array[TKeymanWebTouchStandardKey] of string = (
'K_LOPT',
'K_ROPT',
'K_NUMERALS',
'K_SYMBOLS',
'K_CURRENCIES',
'K_UPPER',
'K_LOWER',
'K_ALPHA',
'K_SHIFTED',
'K_ALTGR',
'K_TABBACK',
'K_TABFWD');
implementation
uses
System.SysUtils,
System.TypInfo;
function FindVKeyName(const txt: string): Word;
var
i: Integer;
t: TKeymanWebTouchStandardKey;
begin
if txt = '' then
Exit($FFFF);
for i := Low(VKeyNames) to High(VKeyNames) do
if SameText(txt, VKeyNames[i]) or SameText(txt, VKeyISO9995Names[i]) then
Exit(i);
for t := Low(TKeymanWebTouchStandardKey) to High(TKeymanWebTouchStandardKey) do
if SameText(txt, KeymanWebTouchStandardKeys[t]) then
Exit(Ord(t));
for i := 0 to High(AdditionalKeyNames) do
if SameText(txt, AdditionalKeyNames[i].Name) then
Exit(AdditionalKeyNames[i].Code);
Result := $FFFF;
end;
end.