Share via


Visual FoxPro Key Codes (API Library Construction)

Most keyboard keys have a constant value even when combined with different modifier keys (SHIFT, CTRL and ALT). All regular keys on the keyboard (alphabet and special characters) have a key code of their ASCII value.

Key code and key modifier values are returned in the EventRec structure. The key code can be found in EventRec.message and the key modifiers can be found in EventRec.modifiers.

Visual FoxPro interprets some keys as having a different value depending on the modifier with which they are combined. For example, if SHIFT+F10 is pressed, the corresponding fields in the EventRec would be:

  • EventRec.message = 15D (Hex)
  • EventRec.modifier = 1000 (Hex)

Similarly, if CTRL+F10 is pressed, the EventRec values would be:

  • EventRec.message = 167 (Hex)
  • EventRec.modifiers = 2000 (Hex)

When more than one modifier is used with a key, the modifier values are added together. For example, if you press CTRL+SHIFT+F10, the following values are returned:

  • EventRec.message = 167 (Hex)
  • EventRec.modifiers = 3000 (Hex)

The EventRec.modifiers value in the preceding example is 0x3000 because both the CTRL and SHIFT modifiers were included in the key press. Thus, the SHIFT key modifier (0x1000) was added to the CTRL key modifier (0x2000) to produce a value of 0x3000.

Note   The manner in which Visual FoxPro interprets keys (specifically keys with modifiers) is inherent to Visual FoxPro. Other programs may interpret keys differently. If a key is pressed in combination with one or multiple modifier keys (SHIFT, CTRL and ALT), the uppermost nibble represents the modifiers that were used.

The following table demonstrates that the F8 key has a different key code depending on the modifier used.

Keys pressed Modifier Key value of F8
F8 None \x142
SHIFT+F8 SHIFT \x15B
CTRL+F8 CTRL \x165
ALT+F8 ALT \x16F
Macintosh keyboard MS-DOS/Windows equivalent
CTRL
CTRL+OPTION ALT

Each special key that can be combined with modifiers has a unique value when combined with each modifier. If a special key is combined with multiple modifiers, the unique value assigned to the key is its value for one of the modifiers according to the following rules:

  1. First check to see if the key combination pressed includes the ALT key because the main key will be assigned its ALT key value.
  2. If the key combination does not include ALT, check to see if the CTRL key modifier was used because the main key will be assigned its CTRL key value.
  3. If no ALT or CTRL key modifier is used, check to see if the SHIFT key modifier was used because the main key will be assigned its SHIFT key value.
  4. Finally, if no modifiers were used, the main key is assigned its value based on no modifiers.

Special Key Codes

The following table lists the key values assigned by Visual FoxPro to special keys on the keyboard.

Key Key code (Hex) Key modifier
LEFTMOUSE 100 None
F1 13B None
F2 13C None
F3 13D None
F4 13E None
F5 13F None
F6 140 None
F7 141 None
F8 142 None
F9 143 None
F10 144 None
HOME 147 None
UPARROW 148 None
PGUP 149 None
LEFTARROW 14B None
RIGHTARROW 14D None
END 14F None
DNARROW 150 None
PGDN 151 None
INS 152 None
DEL 153 None
F11 185 None
F12 186 None
BACKTAB 10F shiftKey
SHIFT+F1 154 shiftKey
SHIFT+F2 155 shiftKey
SHIFT+F3 156 shiftKey
SHIFT+F4 157 shiftKey
SHIFT+F5 158 shiftKey
SHIFT+F6 159 shiftKey
SHIFT+F7 15A shiftKey
SHIFT+F8 15B shiftKey
SHIFT+F9 15C shiftKey
SHIFT+F10 15D shiftKey
SHIFT+F11 187 shiftKey
SHIFT+F12 188 shiftKey
CTRL+A 001 ctrlKey
CTRL+B 002 ctrlKey
CTRL+C 003 ctrlKey
CTRL+D 004 ctrlKey
CTRL+E 005 ctrlKey
CTRL+F 006 ctrlKey
CTRL+G 007 ctrlKey
CTRL+H 008 ctrlKey
CTRL+I 009 ctrlKey
CTRL+ENTER 00A ctrlKey
CTRL+J 00A ctrlKey
CTRL+K 00B ctrlKey
CTRL+L 00C ctrlKey
CTRL+M 00D ctrlKey
CTRL+N 00E ctrlKey
CTRL+O 00F ctrlKey
CTRL+P 010 ctrlKey
CTRL+Q 011 ctrlKey
CTRL+R 012 ctrlKey
CTRL+S 013 ctrlKey
CTRL+T 014 ctrlKey
CTRL+U 015 ctrlKey
CTRL+V 016 ctrlKey
CTRL+W 017 ctrlKey
CTRL+X 018 ctrlKey
CTRL+Y 019 ctrlKey
CTRL+Z 01A ctrlKey
CTRL+LBRACKET 01B ctrlKey
CTRL+BACKSLASH 01C ctrlKey
CTRL+RBRACKET 01D ctrlKey
CTRL+CARET 01E ctrlKey+shiftKey
CTRL+HYPHEN 01F ctrlKey
CTRL+SPACEBAR 020 ctrlKey
CTRL+F1 15E ctrlKey
CTRL+F2 15F ctrlKey
CTRL+F3 160 ctrlKey
CTRL+F4 161 ctrlKey
CTRL+F5 162 ctrlKey
CTRL+F6 163 ctrlKey
CTRL+F7 164 ctrlKey
CTRL+F8 165 ctrlKey
CTRL+F9 166 ctrlKey
CTRL+F10 167 ctrlKey
CTRL+LEFTARROW 173 ctrlKey
CTRL+RIGHTARROW 174 ctrlKey
CTRL+END 175 ctrlKey
CTRL+PGDN 176 ctrlKey
CTRL+HOME 177 ctrlKey
CTRL+PGUP 184 ctrlKey
CTRL+F11 189 ctrlKey
CTRL+F12 18A ctrlKey
CTRL+UPARROW 18D ctrlKey
CTRL+DNARROW 191 ctrlKey
CTRL+INS 192 ctrlKey
CTRL+DEL 193 ctrlKey
CTRL+TAB 194 ctrlKey
ALT+Q 110 altKey
ALT+W 111 altKey
ALT+E 112 altKey
ALT+R 113 altKey
ALT+T 114 altKey
ALT+Y 115 altKey
ALT+U 116 altKey
ALT+I 117 altKey
ALT+O 118 altKey
ALT+P 119 altKey
ALT+A 11E altKey
ALT+S 11F altKey
ALT+D 120 altKey
ALT+F 121 altKey
ALT+G 122 altKey
ALT+H 123 altKey
ALT+J 124 altKey
ALT+K 125 altKey
ALT+L 126 altKey
ALT+Z 12C altKey
ALT+X 12D altKey
ALT+C 12E altKey
ALT+V 12F altKey
ALT+B 130 altKey
ALT+N 131 altKey
ALT+M 132 altKey
ALT+F1 168 altKey
ALT+F2 169 altKey
ALT+F3 16A altKey
ALT+F4 16B altKey
ALT+F5 16C altKey
ALT+F6 16D altKey
ALT+F7 16E altKey
ALT+F8 16F altKey
ALT+F9 170 altKey
ALT+F10 171 altKey
ALT+1 178 altKey
ALT+2 179 altKey
ALT+3 17A altKey
ALT+4 17B altKey
ALT+5 17C altKey
ALT+6 17D altKey
ALT+7 17E altKey
ALT+8 17F altKey
ALT+9 180 altKey
ALT+0 181 altKey
ALT+F11 18B altKey
ALT+F12 18C altKey
ALT+HOME 197 altKey
ALT+UPARROW 198 altKey
ALT+PGUP 199 altKey
ALT+LEFTARROW 19B altKey
ALT+RIGHTARROW 19D altKey
ALT+END 19F altKey
ALT+DNARROW 1A0 altKey
ALT+PGDN 1A1 altKey
ALT+INS 1A2 altKey
ALT+DEL 1A3 altKey

Example

FAR EventHandler(WHandle theWindow, EventRec FAR *ev) 
{
switch(ev->what)
{
case keyDownEvent:                  /* Check the keyDownEvent */
if (ev->modifiers & shiftCodeMask)      /* A modifier was pressed. */
{
if (ev->modifiers & altKey)            /* Check for the ALT Key */
_PutStr("ALT Key Code should be used.\n"); 
else
if (ev->modifiers & ctrlKey)         /* CTRL Key */
_PutStr("CTRL Key Code should be used.\n");
else
if (ev->modifiers & shiftKey)         /* SHIFT Key */
_PutStr("SHIFT Key Code should be used.\n");
}
else
_PutStr("Regular Key Code should be used.\n"); 
return NO;                        /* Let Visual FoxPro have Key also */ 
break;
default:
return NO;
}
}

Note   shiftCodeMask, altKey, ctrlKey, and shiftKey are all defined in PRO_EXT.H and PRO_EXT.INC as follows:

  • #define shiftCodeMask 0xf000
  • #define shiftKey 0x1000
  • #define ctrlKey 0x2000
  • #define altKey 0x4000

See Also

External Routines A-Z | External Routines by Category | _PutStr( ) API Library Routine | _ASCIICOLS System Variable | _ASCIIROWS System Variable | Visual FoxPro System Events (API Library Construction) | KeyPress Event