第四章 键盘
本章主要学习了windows键盘处理的过程,东西很杂碎,wParam lParam这两个重要的参数。
/***************************************************************/
队列和同步
当使用者按下并释放键盘上的键时,产生的格式消息并不保存在消息队列中,windows在所谓的系统消息队列中保存这些消息。只有当Windows应用程序处理完前一个使用者输入消息时,Windows才会从系统消息队列中取出下一个消息,并将其放入应用程序的消息队列中。
按键消息
当按下一个键时,windows把WM_KEYDOWN或WM_SYSKEYDOWN消息放入具有输入焦点的窗口的消息队列,当释放一个键时,windows吧WM_KEYUP或WM_SYSKEYUP放入消息队列。
虚拟键码
虚拟键码保存在WM_KEYDOWN WM_KEYUP WM_SYSKEYDOWN WM_SYSKEYUP中的wParam参数中,此代码标识按下或释放的按键。而lParam保存了下列6个字段32字节的信息:
0~15: 16-Bit Repeat Count 16~23: 8-bit OEM Scan Code 24: Extended Key Flag 29: Context Code 30: PreviousKeyState 31:
虚拟键码中由四个键 VK_LBUTTON ,VK_RBUTTON,VK_MBUTTON,VK_CANCEL,我们不能从键盘消息中捕获这几个键码,我们只能从鼠标消息中捕获他们。
/***********************************************************/
·键的先前状态:如果在此之前键是释放的,则键的先前状态为0,否则为1, WM_KEYUP WM_SYSKEYUP消息中总是设定为1.
·转换状态:如果键正被按下,则转换状态为0;如果键正被释放,则转换状态为1。对WM_KEYDOWN或者WM_SYSKEYDOWN消息,此字段为0;对WM_KEYUP或者WM_SYSKEYUP消息,此字段为1。
·位移状态
在处理按键消息时,您可能需要知道是否按下了位移键(Shift、Ctrl和Alt)或开关键(Caps Lock、Num Lock和Scroll Lock)。通过呼叫GetKeyState函数,您就能获得此信息。例如:
iState = GetKeyState (VK_SHIFT) ;
如果按下了Shift,则iState值为负(即设定了最高位置位)。如果Caps Lock键打开,则从
iState = GetKeyState (VK_CAPITAL) ;
传回的值低位被设为1。此位与键盘上的小灯保持一致。
/**************************************************************/
当我们需要捕获一些字符按键,可以用WM_CHAR捕获字符按键。例如在窗口消息处理函数中:
case VM_CHAR:
switch(wParam)
{
case ‘a’:
do something;
break;
case ‘b’:
do something else]
break;
}
Break;