📄 untitled-01.txt
字号:
第3$围标和键盘
如果生活像电影上演的那样,那么传统的输人设备早就已经让位给语音识别单元、3D
耳机以及别的人机接口配件了。但是,目前我们仍然保留着两个最普通的输人设备:鼠标
和键盘。 Microsoft Windows自己处理一些鼠标和键盘输人,例如,当用户在菜单栏上单击一
个项目时,会自动拉下一个菜单,并在菜单中的某个项目被选定后给应用程序发送一个
WM.COMMAND消息。要编写一个不直接处理鼠标或键盘输人的功能完整的Windows程序
是完全可能的,但是作为一个应用程序开发者,您最终将会发现有必要直接接收鼠标和键盘
输人。如果要这样做,您需要了解Windows提供的鼠标和键盘接口。
不必奇怪,鼠标和键盘输人以消息的形式出现。设备驱动程序处理鼠标和键盘中断并
将结果事件通知放在一个系统范围队列中,该队列称为原始输人队列。与常规消息一样,在
原始输人队列的输人项也用WM一作为消息标识符,但是其中的数据在被应用程序使用以
前要做进一步的处理。操作系统拥有一个专门的线程来监视原始输人队列。它把每个从队
列中出来的消息都转移到适当的线程消息队列中。稍后,对消息数据的处理是在接收应用
程序的描述表中进行的,像对其他任何消息一样,消息最终将被检索并调度。
这种输人模式与16位Windows不同,它始终将鼠标和键盘消息保存在单个系统范围输
人队列中直到消息被应用程序检索。这种安排是一种按部就班的方式,如果一个应用程序
不能够及时处理输人的消息,那么它也必将阻止其他应用程序这样做。Win32的异步输人
模式解决了这个问题,它使用原始输人队列作为临时的保存缓冲区,并以最大的可能性将输
人消息移动给线程消息队列。(在 32位 Windows操作系统中,调用 Windows API函数的每个
线程都有自己的消息队列,因此一个多线程应用程序具有多个消息队列。)一个32位应用
程序并不会去检查消息队列,它懒惰地响应用户输人,但是这并不会影响在系统中运行的
其他应用程序的响应能力。
学习响应Windows应用程序中鼠标和键盘的输人主要就是了解处理哪个消息的问题。
本章将介绍鼠标和键盘消息以及多个MFC和API函数,这些函数对于消息处理是很有用
的。我们将通过开发3个样例应用程序把这里给出的概念应用到现实世界中:
. ncrac,一个井字游戏,用来说明如何响应鼠标单击
. MouseCap,一个简单的绘图程序,用来说明鼠标的截获功能以及非客户区鼠标消息
的处理过程
. VisualKB,一个打字程序,用来将鼠标和键盘处理程序结合在一起,并列出了它接
收到的键盘消息
我们还有很多内容要学,现在开始吧。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -