来源: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,可得到完整的列表。