关于键盘输入
应用程序应该像接收鼠标输入一样可以接收键盘输入,Windows中的应用程序是以窗体消息的形式来获取键盘输入。
本节包括以下内容:
键盘输入模型
系统通过安装当前键盘的设备驱动来实现与应用程序的设备无关性,也可以通过用户或应用程序的键盘布局设置来实现语言无关性。键盘设备驱动接收键盘的“扫描码”,然后把“扫描码”发送给键盘布局,通过键盘布局被转换为消息并发送到应用程序的相应窗口。
键盘上每一个键都有一个唯一值,这个唯一值就称为“扫描码”(scan code),对于键盘上每个键来说,“扫描码”是设备相关的。当用户按键时会产生两次扫描码,一次是按下键时,一次是放开时。
然后,键盘驱动把扫描码解释并转换(映射)为“虚键码”(virtual-key code),这个码是设备无关的,其值被系统所定义并用来标识每一个键。转换扫描码后,键盘布局会创建一个包含扫描码、虚键码以及其他按键信息的消息,并把这个消息放入系统消息队列。接着,系统从系统消息队列中删除该消息,再投递到相应线程的消息队列中。最后,线程的消息循环移除该消息并传递到相应窗口过程以进行处理。下图即键盘输入模型:
键盘聚焦及激活
系统投递键盘消息到前台线程的消息队列中,这个前台线程应该是创建当前获得焦点的窗口的线程。键盘聚焦(Keyboard focus)是一个窗体的临时属性。系统通过键盘聚焦来向所有的显示窗体共享键盘,从用户的角度讲,键盘聚焦也就意味着,从一个窗口转到另外一个。获取焦点的窗口接收(从创建它的线程的消息队列中)接收所有的键盘消息,直到焦点转移到另外的窗体上。
线程可以通过调用GetFocus函数来确定那个窗口为当前窗口(已经键盘聚焦),也可以通过SetFocus来使哪个窗口获取焦点。当键盘聚焦从一个窗口换到另外一个时,系统会发送WM_KILLFOCUS到失去焦点的窗口,然后发送WM