Virtual-Key Codes

Introduction

The virtual-key codes provide a hardware- and language-independent method of identifying keyboard keys. Each virtual-key code represents a unique keyboard key and also identifies the purpose of that key. The keyboard driver must provide one or more keyboard layouts that maps keyboard scan codes to the appropriate virtual-key codes.

Required Virtual Keys

The complete virtual-key code set consists of 256 byte values in the range 0 to 255. Most, but not all, of the values used by standard drivers are in the range 0 to 127. There is a loose distinction between "standard" keys, which do not vary much, and "OEM" keys, which do vary from keyboard to keyboard.

For full Windows functionality, a keyboard driver must provide the following virtual keys:

Virtual-key code

Description

VK_0 through VK_9

Number keys (not on numeric keypad): 0 through 9

VK_A through VK_Z

Letter keys: A through Z

VK_BACK

BACKSPACE key

VK_CONTROL

CTRL key

VK_DELETE

DELETE key

VK_DOWN

Down direction key

VK_END

END key

VK_ESCAPE

ESC key

VK_F1 through VK_F10

F1 through F10 keys

VK_HOME

HOME key

VK_INSERT

INSERT key

VK_LEFT

Left direction key

VK_MENU

ALT key

VK_NEXT

PAGE DOWN key

VK_PRIOR

PAGE UP key

VK_RIGHT

Right direction key

VK_SHIFT

Left and right SHIFT keys

VK_SNAPSHOT

PRINTSCREEN key

VK_SPACE

SPACE key

VK_TAB

TAB key

VK_UP

Up direction key


Shift keys must be available in the combinations unshifted, SHIFT, CTRL, and CTRL+ALT.

Most keyboards, the virtual-key codes VK_INSERT, VK_DELETE, VK_HOME, VK_END, VK_PRIOR, and VK_NEXT are generated on the numeric keypad only if NUMLOCK is off.

Optional Virtual Keys

If a keyboard has a numeric pad, the numeric keys are frequently used as cursor-control and editing keys if NUMLOCK is off. If NUMLOCK is on, the virtual-key codes VK_NUMPAD0 through VK_NUMPAD9 are used for the digits. Keyboards with a DELETE key that also generates the decimal point (period or comma) use VK_DELETE and VK_DECIMAL to distinguish between the two uses of the key.

Keyboards commonly contain various "lock" keys, such as VK_CAPITAL and VK_NUMLOCK. If a keyboard driver generates ANSI characters on the numeric keypad using ALT + numeric-pad keys, it must do this translation only if NUMLOCK is on. The cursor and editing keys on IBM-compatible keyboards do not produce this translation.

Other keys may vary from keyboard to keyboard. The following set of virtual-key codes is generally used for punctuation keys, accented letter keys, and dead keys in the main section of a keyboard:

VK_OEM_1 ... VK_OEM_8

VK_OEM_102

VK_OEM_PLUS, VK_OEM_MINUS, VK_OEM_COMMA, VK_OEM_PERIOD

If a keyboard has more than 16 function keys, the virtual-key codes in the range VK_F17 through VK_F24 should be used for the extra function keys.

Windows internally generates the mouse-button virtual-key codes VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, and VK_CANCEL. These virtual-key codes are generated internally by Windows and are never generated by keyboard or mouse drivers.

Keyboard drivers should not generate VK_EXECUTE or VK_SEPARATER.

Virtual Keys for 122-Key Keyboards

For keyboards with 122 keys, the mapping for the first 101 keys is the same as described in previous sections.

The function keys F13 through F24 should use VK_F13 through VK_F24.

The remaining keys should be mapped to the following virtual-key codes:

VK_ATTN

VK_OEM_CLEAR

VK_CRSEL

VK_PA1

VK_EREOF

VK_PLAY

VK_EXSEL

VK_ZOOM

VK_NONAME


Virtual-Key Code Definitions

The following table includes the virtual-key codes that are defined for Windows. The key code values 0 and 0FFh are not used.

Virtual-key Codes

Name

Value

Comment

VK_LBUTTON

01h

Left mouse button.

VK_RBUTTON

02h

Right mouse button.

VK_CANCEL

03h

Used for control-break processing.

VK_MBUTTON

04h

Middle mouse button (3-button mouse).

05h through 07h undefined.

VK_BACK

08h

VK_TAB

09h

0Ah and 0Bh undefined.

VK_CLEAR

0Ch

VK_RETURN

0Dh

0Eh and 0Fh undefined.

VK_SHIFT

10h

VK_CONTROL

11h

VK_MENU

12h

VK_PAUSE

13h

VK_CAPITAL

14h

15h through 1Ah undefined.

VK_ESCAPE

1Bh

1Ch through 1Fh undefined.

VK_SPACE

20h

VK_PRIOR

21h

Page up.

VK_NEXT

22h

Page down.

VK_END

23h

VK_HOME

24h

VK_LEFT

25h

VK_UP

26h

VK_RIGHT

27h

VK_DOWN

28h

VK_SELECT

29h

VK_PRINT

2Ah

Only used by Nokia.

VK_EXECUTE

2Bh

Never used.

VK_SNAPSHOT

2Ch

SYSREQ key starting with Windows 3.0.

VK_INSERT

2Dh

VK_DELETE

2Eh

VK_HELP

2Fh

VK_0

30h

VK_1

31h

VK_2

32h

VK_3

33h

VK_4

34h

VK_5

35h

VK_6

36h

VK_7

37h

VK_8

38h

VK_9

39h

3Ah though 40h undefined.

VK_A

41h

VK_B

42h

VK_C

43h

VK_D

44h

VK_E

45h

VK_F

46h

VK_G

47h

VK_H

48h

VK_I

49h

VK_J

4Ah

VK_K

4Bh

VK_L

4Ch

VK_M

4Dh

VK_N

4Eh

VK_O

4Fh

VK_P

50h

VK_Q

51h

VK_R

52h

VK_S

53h

VK_T

54h

VK_U

55h

VK_V

56h

VK_W

57h

VK_X

58h

VK_Y

59h

VK_Z

5Ah

5Bh through 5Fh undefined.

VK_NUMPAD0

60h

VK_NUMPAD1

61h

VK_NUMPAD2

62h

VK_NUMPAD3

63h

VK_NUMPAD4

64h

VK_NUMPAD5

65h

VK_NUMPAD6

66h

VK_NUMPAD7

67h

VK_NUMPAD8

68h

VK_NUMPAD9

69h

VK_MULTIPLY

6Ah

VK_ADD

6Bh

VK_SEPARATER

6Ch

Never generated by keyboard driver.

VK_SUBTRACT

6Dh

VK_DECIMAL

6Eh

VK_DIVIDE

6Fh

VK_F1

70h

VK_F2

71h

VK_F3

72h

VK_F4

73h

VK_F5

74h

VK_F6

75h

VK_F7

76h

VK_F8

77h

VK_F9

78h

VK_F10

79h

VK_F11

7Ah

VK_F12

7Bh

VK_F13

7Ch

VK_F14

7Dh

VK_F15

7Eh

VK_F16

7Fh

VK_F17

80h

VK_F18

81h

VK_F19

82h

VK_F20

83h

VK_F21

84h

VK_F22

85h

VK_F23

86h

VK_F24

87h

88h through 8Fh unassigned.

VK_NUMLOCK

090h

NUMLOCK on all keyboards.

VK_OEM_SCROLL

091h

SCROLL LOCK on all keyboards.

92h through B9h unassigned.

VK_OEM_1

0BAh

Punctuation.

VK_OEM_PLUS

0BBh

Punctuation.

VK_OEM_COMMA

0BCh

Punctuation.

VK_OEM_MINUS

0BDh

Punctuation.

VK_OEM_PERIOD

0BEh

Punctuation.

VK_OEM_2

0BFh

Punctuation.

VK_OEM_3

0C0h

Punctuation.

C1h through DAh unassigned.

VK_OEM_4

0DBh

Punctuation.

VK_OEM_5

0DCh

Punctuation.

VK_OEM_6

0DDh

Punctuation.

VK_OEM_7

0DEh

Punctuation.

VK_OEM_8

0DFh

Punctuation.

VK_F17

0E0h

F17 key on Olivetti extended keyboard (internal use only).

VK_F18

0E1h

F18 key on Olivetti extended keyboard (internal use only).

VK_OEM_102

0E2h

< or | on IBM-compatible 102 enhanced keyboard (non-U.S.).

VK_ICO_HELP

0E3h

Help key on Olivetti extended keyboard (internal use only).

VK_ICO_00

0E4h

00 key on Olivetti extended keyboard (internal use only).

E5h unassigned.

VK_ICO_CLEAR

0E6h

Olivetti extended keyboard (internal use only).

E7h and E8h unassigned.

VK_OEM_RESET

0E9H

Only used by Nokia.

VK_OEM_JUMP

0EAH

Only used by Nokia.

VK_OEM_PA1

0EBH

Only used by Nokia.

VK_OEM_PA2

0ECH

Only used by Nokia.

VK_OEM_PA3

0EDH

Only used by Nokia.

VK_OEM_WSCTRL

0EEH

Only used by Nokia.

VK_OEM_CUSEL

0EFH

Only used by Nokia.

VK_OEM_ATTN

0F0H

Only used by Nokia.

VK_OEM_FINNISH

0F1H

Only used by Nokia.

VK_OEM_COPY

0F2H

Only used by Nokia.

VK_OEM_AUTO

0F3H

Only used by Nokia.

VK_OEM_ENLW

0F4h

Only used by Nokia.

VK_OEM_BACKTAB

0F5h

Only used by Nokia.

VK_ATTN

0F6H

VK_CRSEL

0F7H

VK_EXSEL

0F8H

VK_EREOF

0F9H

VK_PLAY

0FAH

VK_ZOOM

0FBH

VK_NONAME

0FCH

VK_PA1

0FDH

VK_OEM_CLEAR

0FEH