键盘
谁获得了了焦点
由于程序可能有多个窗体,问题如果如何判断哪一个窗体获取了键盘输入,这是回想MSG每一个时间所得到的信息中都会得到一个hwnd结构,(不多想线程队列事情只针对每一个hwnd)。然后由信息回圈函数DispatchMessage函数向视窗发送信息。
每一个窗体的信息处理函数可以通过拦截WM_SETFOCUS 和 WM_KILLFOCUS 信息来判定它的视窗什么时候获得了焦点。WM_SETFOCUS指示正在得到输入焦点,WM_KILLFOUCS表示视窗正在失去输入焦点。
序列和同步
一般系统中应该存在一个缓存的消息队列,这个和每一个窗体的消息队列并不相同,对于每一个消息的传送,应该是先到系统消息队列,然后从系统消息队列中然后在由系统分发到每一个窗体的消息队列中。
系统消息队列存在目的,当每个窗体的消息处理函数不能够很及时的处理每一个窗体的消息时候,系统消息队列可以充当一个缓冲区的作用。然后记录先每一个消息对应的窗体然后在进行消息的分发工作。
按键和字元
按键天然存在的东西,比如键盘上所存在的ABCDEF等等,但是转入操作系统后应该的存在形式应该是字元,逻辑上的东西,因为比如说有的操作我们使用了两个键盘上的字符,比如说使用了CRTRL+F4按键关闭窗体,但是在系统内这两个按键等同于一个字元,也就是我们只需对其作出一个操作。
按键消息
WM_KEYDOWN和WM_KEYUP讯息通常是在按下或者释放不带Alt键的键时产生
的,您的程式可以使用或者忽略这些讯息,Windows 本身并不处理这些讯息。
对所有四类按键讯息,wParam 是虚拟键代码,表示按下或释放的键,而
lParam 则包含属於按键的其他资料。 (最后一句有助于理解虚拟键码)
虚拟键码
wParam中包含了多数应该是虚拟键码
虚拟键码保存在WM_KEYDOWN,WM_KEYUP,WM_SYSKEYDOWN 和 WM_SYSKEYUP 讯息的wParam参数中。此代码标示按下或者释放的键。不过貌似VK只有八位(#define VK_LBUTTON 0x01),wParam中应该还保留有其他的信息。
lParam 的信息
重复计数 Repeat Count
按了多少次某个键,大多数设定为1,多数可以忽略。
OEM扫描码 (OEM SCAN CODE)
貌似还是为了兼容性一些问题保留的。
扩充键标志位(Extended Key Flag)
IBM增强键盘的附加减识别。通常忽略
内容代码(Context Code)
解释没看太懂。
键的先前状态(Previous Key State)
如果此前此键是释放的(没有被按),则键的先前状态为0;否则为1;对于WM_KEYUP活着WM_SYSKEUP消息 (标示键要谈起,所以肯定已经被按了)他始终为1.WM_KEYDOWN和WM_SYSKEYDOWN消息,这个标志位可以为1也可以为0;
状态转换(Transition State)
如果键正在被按下,则转换状态为0,如果键正在被释放,则转换状态为1;对于WM_KEYDOWN或者WM_SYSKEYDOWN消息此标志位为0,对于WM_KEYUP活着WM_SYSKEYUP消息,此标志位为1.
位移状态
处理按键信息时候需要知道是否按下了位移键(Shift,Ctrl,和 Alt)或者开关键(Caps Lock,Num Lock,和 SrollLock)。通过呼叫GetKeyState函数可以获得这个标志位的信息。
iState = GetKeyState(VK_SHIFT);
如果按下了Shift,则iState值为负。
使用按键信息