更新时间:2024-06-01 17:11
虚拟键码保存在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_开头。表1列出了这些名称和数值(十进位和十六进位),以及与虚拟键相对应的IBM相容机种键盘上的键。下表也标出了Windows执行时是否需要这些键。下表还按数位顺序列出了虚拟键码。
前四个虚拟键码中有三个指的是鼠标键:
表1
您永远都不会从键盘讯息中获得这些鼠标键代码。VK_CANCEL代码是一个虚拟键码,它包括同时按下两个键(Ctrl-Break)。Windows应用程序通常不使用此键。
表2中的键——Backspace、Tab、Enter、Esc和空格——通常用于Windows程序。不过,Windows一般用字元讯息(而不是键盘讯息)来处理这些键。
表2
另外,Windows程序通常不需要监视Shift、Ctrl或Alt键的状态。
表3列出的前八个码可能是与VK_INSERT和VK_DELETE一起最常用的虚拟键码:
表3
注意,许多名称(例如VK_PRIOR)Windows也包括在主键盘上的字母和数位键的虚拟键码(数字键盘将单独处理)。
表4
注意,数字和字母的虚拟键码是ASCII码。Windows程序几乎从不使用这些虚拟键码;实际上,程序使用的是ASCII码字元的字元讯息。
表5所示的代码是由Microsoft Natural Keyboard及其相容键盘产生的:
表5
Windows用VK_LWIN和VK_RWIN键打开“开始”菜单或者(在以前的版本中)启动“工作管理员程序”。这两个都可以用于登录或登出Windows(只在Microsoft Windows NT中有效),或者登录或登出网路(在Windows for Applications中)。应用程序能够通过显示辅助资讯或者当成快捷键看待来处理application键。
表6所示的代码用于小键盘上的键(如果有的话):
表6
最後,虽然多数的键盘都有12个功能键,但Windows只需要10个,而位元旗标却有24个。另外,程式通常用功能键作为键盘加速键,这样,它们通常不处理表7所示的按键:
表7
另外,还定义了一些其他虚拟键码,但它们只用于非标准键盘上的键,或者通常在大型主机终端机上使用的键。查看/ Platform SDK / User Interface Services / User Input / Virtual-Key Codes,可得到完整的列表。
完整的虚拟键码表
键盘的扫描码、虚拟码
当用户按下某个键时,
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.