二、Windows按键消息—虚拟键码
虚拟键码保存在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,可得到完整的列表。
