1. 键盘输入焦点:
1) 一台电脑只有一个键盘,因此键盘必须为所有应用程序锁共享;
2) 同样,如果一个应用程序在使用键盘,那么该应用程序的所有窗口也应该共享键盘;
3) 输入焦点:根据消息循环的机制,当敲击键盘产生键盘消息后只有一个窗口会接收到键盘消息,而该窗口就是具有输入焦点的窗口;
4) 如何判断一个具有输入焦点的窗口:必定为活动窗口或者是活动窗口的各个子孙窗口中的一个;
5) 活动窗口及其子孙窗口:活动即顶层窗口(其父指针为NULL),活动窗口的标题栏会高亮(非活动窗口,即被盖在下面的窗口标题栏通常是灰色的),如果没有标题栏,则其边框是高亮的,并且活动窗口最小化到任务栏后也会被凸显(就像一个被按下的按钮一样),子窗口不能是活动窗口(子窗口只能沾活动窗口的光),即活动窗口的子孙窗口可以获得输入焦点,比如对话框中的编辑框就是当前活动窗口对话框中的一个子窗口;
特殊情况:没有窗口但是具有输入焦点(当程序最小化的时候),焦点的含义就是当前正在被使用的那个对象窗口,只要这么简单地理解就行了!
6) 一个窗口如何判断自己是否获得焦点:如果收到WM_SETFOCUS消息就表明自己获得了输入焦点,如果收到WM_KILLFOCUS消息则表示自己失去了焦点,一般当一个窗口被用户点击被显示在了最顶层时就会收到WM_SETFOCUS消息,当用户点击了另一个窗口而导致另一个窗口处于最顶层而当前窗口被盖在了下面,此时该窗口就会收到一个WM_KILLFOCUS消息;
2. 系统消息队列和同步:
1) 由于来自键盘和鼠标的消息不一定都是集中在一个窗口的,用户想将一部分来自键盘和鼠标的消息给一个窗口处理,另一部分交给另一个窗口处理,但是用户无法直接干涉消息如何分发,因此这就需要先创建一个系统消息队列来暂时收容来自键盘和鼠标的消息,然后系统根据当前哪个窗口具有焦点来决定将收容的消息分配给哪个应用程序的消息队列;
2) 系统需要同步:用户可能连续产生若干个消息,比如WM1、WM2、WM3、WM4...,其中1和2是交给当前焦点窗口处理的,而3是一个将焦点转向另一个窗口的消息,而后面的消息都是交由新焦点窗口处理的消息,如果此时一股脑儿将所有消息都先扔给当前焦点窗口则必然会发生错误和混乱,因此系统消息队列最重要的一个特征就是同步,同步就是指只有当上一个消息处理完之后才会继续从系统消息队列中取走下一个消息分发给当前焦点窗口,这样就能避免将消息发送给错误的窗口;
3. 击键消息机器虚拟键代码:
1) 击键仅仅代表一个物理动作,键按下和放开都是一次击键(也就是两次击键),表示有一个键按下的消息是WM_KEYDOWN消息,而键放开的消息是WM_KEYUP消息;
2) 通常击键消息是连续追踪的,当按下一个键不放时将会产生连续击键行为,窗口会收到一连串WM_KEYDOWN消息,但是WM_KEYUP是不连续的,一次按键只能对应一个释放动作;
3) 系统击键和非系统击键:
i) 击键消息汇总: