源地址:http://c.biancheng.net/cpp/html/1253.html
虛擬鍵碼保存在WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP消息的wParam參數中。此代碼標識按下或釋放的鍵。
哈,又是「虛擬」,您喜歡這個詞嗎?虛擬指的是假定存在於思想中而不是現實世界中的一些事物,也只有熟練使用DOS匯編語言編寫應用程序的程序寫作者才有可能指出,為什么對Windows鍵盤處理如此基本的鍵碼是虛擬的而不是真實的。
對於早期的程序寫作者來說,真實的鍵碼由實際鍵盤硬件產生。在Windows文件中將這些鍵碼稱為「掃描碼(scan codes)」。在IBM兼容機種上,掃描碼16是Q鍵,17是W鍵,18是E、19是R,20是T,21是Y等等。這時您會發現,掃描碼是依據鍵盤的實際布局的。Windows開發者認為這些代碼過於與設備相關了,於是他們試圖通過定義所謂的虛擬鍵碼,以便經由與設備無關的方式處理鍵盤。其中一些虛擬鍵碼不能在IBM兼容機種上產生,但可能會在其它制造商生產的鍵盤中找到,或者在未來的鍵盤上找到。
您使用的大多數虛擬鍵碼的名稱在WINUSER.H表頭文件中都定義為以VK_開頭。表6-2列出了這些名稱和數值(十進制和十六進制),以及與虛擬鍵相對應的IBM兼容機種鍵盤上的鍵。下表也標出了Windows執行時是否需要這些鍵。下表還按數字順序列出了虛擬鍵碼。
前四個虛擬鍵碼中有三個指的是鼠標鍵:
表6-2 |
十進制 |
十六進制 |
WINUSER.H標識符 |
必需? |
IBM兼容鍵盤 |
1 |
01 |
VK_LBUTTON |
鼠標左鍵 |
|
2 |
02 |
VK_RBUTTON |
鼠標右鍵 |
|
3 |
03 |
VK_CANCEL |
ˇ |
Ctrl-Break |
4 |
04 |
VK_MBUTTON |
鼠標中鍵 |
您永遠都不會從鍵盤消息中獲得這些鼠標鍵代碼。在下一章可以看到,我們能夠從鼠標消息中獲得它們。VK_CANCEL代碼是一個虛擬鍵碼,它包括同時按下兩個鍵(Ctrl-Break)。Windows應用程序通常不使用此鍵。
表6-3中的鍵--Backspace、Tab、Enter、Escape和Spacebar-通常用於Windows程序。不過,Windows一般用字符消息(而不是鍵盤消息)來處理這些鍵。
表6-3 |
十進制 |
十六進制 |
WINUSER.H標識符 |
必需? |
IBM兼容鍵盤 |
8 |
08 |
VK_BACK |
ˇ |
Backspace |
9 |
09 |
VK_TAB |
ˇ |
Tab |
12 |
0C |
VK_CLEAR |
Num Lock關閉時的數字鍵盤5 |
|
13 |
0D |
VK_RETURN |
ˇ |
Enter (或者另一個) |
16 |
10 |
VK_SHIFT |
ˇ |
Shift (或者另一個) |
17 |
11 |
VK_CONTROL |
ˇ |
Ctrl (或者另一個) |
18 |
12 |
VK_MENU |
ˇ |
Alt (或者另一個) |
19 |
13 |
VK_PAUSE |
Pause |
|
20 |
14 |
VK_CAPITAL |
ˇ |
Caps Lock |
27 |
1B |
VK_ESCAPE |
ˇ |
Esc |
32 |
20 |
VK_SPACE |
ˇ |
Spacebar |
另外,Windows程序通常不需要監視Shift、Ctrl或Alt鍵的狀態。
表6-4列出的前八個碼可能是與VK_INSERT和VK_DELETE一起最常用的虛擬鍵碼:
表6-4 |
十進制 |
十六進制 |
WINUSER.H標識符 |
必需? |
IBM兼容鍵盤 |
33 |
21 |
VK_PRIOR |
ˇ |
Page Up |
34 |
22 |
VK_NEXT |
ˇ |
Page Down |
35 |
23 |
VK_END |
ˇ |
End |
36 |
24 |
VK_HOME |
ˇ |
Home |
37 |
25 |
VK_LEFT |
ˇ |
左箭頭 |
38 |
26 |
VK_UP |
ˇ |
上箭頭 |
39 |
27 |
VK_RIGHT |
ˇ |
右箭頭 |
40 |
28 |
VK_DOWN |
ˇ |
下箭頭 |
41 |
29 |
VK_SELECT |
||
42 |
2A |
VK_PRINT |
||
43 |
2B |
VK_EXECUTE |
||
44 |
2C |
VK_SNAPSHOT |
Print Screen |
|
45 |
2D |
VK_INSERT |
ˇ |
Insert |
46 |
2E |
VK_DELETE |
ˇ |
Delete |
47 |
2F |
VK_HELP |
注意,許多名稱(例如VK_PRIOR和VK_NEXT)都與鍵上的標志不同,而且也與滾動條中的標識符不統一。Print Screen鍵在平時都被Windows應用程序所忽略。Windows本身響應此鍵時會將視訊顯示的位圖影本存放到剪貼板中。假使有鍵盤提供了VK_SELECT、VK_PRINT、VK_EXECUTE和VK_HELP,大概也沒幾個人看過那樣的鍵盤。
Windows也包括在主鍵盤上的字母和數字鍵的虛擬鍵碼(數字鍵盤將單獨處理)。
表6-5 |
十進制 |
十六進制 |
WINUSER.H標識符 |
必需? |
IBM兼容鍵盤 |
48-57 |
30-39 |
無 |
ˇ |
主鍵盤上的0到9 |
65-90 |
41-5A |
無 |
ˇ |
A到Z |
注意,數字和字母的虛擬鍵碼是ASCII碼。Windows程序幾乎從不使用這些虛擬鍵碼;實際上,程序使用的是ASCII碼字符的字符消息。
表6-6所示的代碼是由Microsoft Natural Keyboard及其兼容鍵盤產生的:
表6-6 |
十進制 |
十六進制 |
WINUSER.H標識符 |
必需? |
IBM兼容鍵盤 |
91 |
5B |
VK_LWIN |
左Windows鍵 |
|
92 |
5C |
VK_RWIN |
右Windows鍵 |
|
93 |
5D |
VK_APPS |
Applications鍵 |
Windows用VK_LWIN和VK_RWIN鍵打開「開始」菜單或者(在以前的版本中)啟動「工作管理員程序」。這兩個都可以用於登錄或注銷Windows(只在Microsoft Windows NT中有效),或者登錄或注銷網絡(在Windows for Applications中)。應用程序能夠通過顯示輔助信息或者當成快捷方式鍵看待來處理application鍵。
表6-7所示的代碼用於數字鍵盤上的鍵(如果有的話):
表6-7 |
十進制 |
十六進制 |
WINUSER.H標識符 |
必需? |
IBM兼容鍵盤 |
96-105 |
60-69 |
VK_NUMPAD0到VK_ NUMPAD9 |
NumLock打開時數字鍵盤上的0到9 |
|
106 |
6A |
VK_MULTIPLY |
數字鍵盤上的* |
|
107 |
6B |
VK_ADD |
數字鍵盤上的+ |
|
108 |
6C |
VK_SEPARATOR |
||
109 |
6D |
VK_SUBTRACT |
數字鍵盤上的- |
|
110 |
6E |
VK_DECIMAL |
數字鍵盤上的. |
|
111 |
6F |
VK_DIVIDE |
數字鍵盤上的/ |
最后,雖然多數的鍵盤都有12個功能鍵,但Windows只需要10個,而位旗標卻有24個。另外,程序通常用功能鍵作為鍵盤快捷鍵,這樣,它們通常不處理表6-8所示的按鍵:
表6-8 |
十進制 |
十六進制 |
WINUSER.H標識符 |
必需? |
IBM兼容鍵盤 |
112-121 |
70-79 |
VK_F1到VK_F10 |
ˇ |
功能鍵F1到F10 |
122-135 |
7A-87 |
VK_F11到VK_F24 |
功能鍵F11到F24 |
|
144 |
90 |
VK_NUMLOCK |
Num Lock |
|
145 |
91 |
VK_SCROLL |
Scroll Lock |
另外,還定義了一些其它虛擬鍵碼,但它們只用於非標准鍵盤上的鍵,或者通常在大型主機終端機上使用的鍵。查看/ Platform SDK / User Interface Services / User Input / Virtual-Key Codes,可得到完整的列表。