基本簡介
虛拟指的是假定存在于思想中而不是現實世界中的一些事物,也隻有熟練使用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 | 1 | VK_LBUTTON | 滑鼠左鍵 |
2 | 2 | VK_RBUTTON | 滑鼠右鍵 |
3 | 3 | VK_CANCEL | Ctrl-Break |
4 | 4 | VK_MBUTTON | 滑鼠中鍵 |
您永遠都不會從鍵盤訊息中獲得這些滑鼠鍵代碼。在下一章可以看到,我們能夠從滑鼠訊息中獲得它們。VK_CANCEL代碼是一個虛拟鍵碼,它包括同時按下兩個鍵(Ctrl-Break)。Windows應用程式通常不使用此鍵。
表6-3中的鍵--Backspace、Tab、Enter、Escape和Spacebar-通常用於Windows程式。不過,Windows一般用字元訊息(而不是鍵盤訊息)來處理這些鍵。
表6-3
十進位 十六進位 WINUSER.H識别字 必需? IBM相容鍵盤
十進制 | WINUSER.H識别字 | IBM相容鍵盤 | |
8 | 8 | VK_BACK | Backspace |
9 | 9 | VK_TAB | Tab |
12 | 0C | VK_CLEAR | Lock關閉時的數字鍵盤5 |
13 | 0D | VK_RETURN | Enter |
16 | 10 | VK_SHIFT | Shift |
展開表格
另外,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 | 左箭頭 |
展開表格
注意,許多名稱(例如VK_PRIORWindows也包括在主鍵盤上的字母和數位鍵的虛拟鍵碼(數字鍵盤将單獨處理)。
十進位 十六進位 WINUSER.H識别字 必需? IBM相容鍵盤
十進制 | 十六進制 | 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鍵 |
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 | 數字鍵盤上的- |
展開表格
最後,雖然多數的鍵盤都有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,可得到完整的列表。
虛拟鍵表
虛拟鍵碼 | 對應值 | 對應鍵 |
VK_LBUTTON | 1 | 鼠标左鍵 |
VK_RBUTTON | 2 | 鼠标右鍵 |
VK_CANCEL | 3 | Cancel |
VK_MBUTTON | 4 | 鼠标中鍵 |
VK_XBUTTON1 | 5 |
展開表格
二維碼介紹
當用戶按下某個鍵時,
1.鍵盤會檢測到這個動作,并通過鍵盤控制器把掃描碼(scan code)傳送到計算機;
鍵盤掃描碼跟具體的硬件有關的,不同廠商對同一個鍵的掃描碼有可能不同。
2.計算機接收到掃描碼後,将其交給鍵盤驅動程序;
3.鍵盤驅動程序把這個掃描碼轉換為鍵盤虛拟碼;
虛拟碼與具體硬件無關,不同廠商的鍵盤,同一個鍵的虛拟碼總是相同的。
3.然後,鍵盤驅動程序把該鍵盤操作的掃描碼和虛拟碼以及其它信息傳遞給操作系統;
4.操作系統将獲得的信息封裝在一個鍵盤消息中,并把該鍵盤消息插入到消息列隊。
5.通過Windows的消息系統,該鍵盤消息被送到某個窗口中;
6.窗口所在的應用程序接收到消息後,可以了解到有關鍵盤操作的信息,然後決定作出一定的響應
鍵盤消息:WM_KEYDOWN
nVirtKey = (int) wParam; // 虛拟碼
lKeyData = lParam; // 鍵盤操作的相關信息
鍵盤消息WM_KEYDOWN的第二個參數lParam比較複雜
其作用是指定重複次數、掃描碼、擴展鍵标記、上下文環境碼、前鍵狀态标記、轉換狀态标記等
lParam: 總長4字節,32位
0–15位:用于指定當前消息的重複次數。當用戶按下某個鍵持續一段時間的話,
該值是自動計數的按下某鍵的次數;若按鍵時間很長,則會發出多個消息,
且重複次數不會累計
16–23:指定掃描碼
24:指定是否該鍵是一個擴展鍵(如alt、ctrl),若值為1表示是擴展鍵,否則其值為0
25–28:保留
29:指定上下文環境碼。對于WM_KEYDOWN、WM_KEYUP消息,其值總為0,
對WM_CHAR消息,如果同時alt鍵被按下,則值為1,否則值為0.
30:指定前鍵狀态。如果消息發送前該鍵是按下狀态,其值為1,否則為0
31:指定轉換狀态,對于WM_KEYDOWN,其值總為0;
對于WM_CHAR,如果該鍵被釋放,則其值為1,否則為0.