一、键盘事件处理过程。
1,击键。
2,windows和键盘驱动程序将硬件扫描吗转化为格式消息,放在windows维护的"系统消息队列"中。
3,windows从系统消息队列中,取一个消息,发送给当前获得焦点的窗口的应用程序消息队列。
4,应用程序处理该该消息完毕后,windows才能接下来从"系统消息队列"中去获得下一个消息。
因为前面的消息处理可能会影响后一个消息的处理情况,比如tab按键可能会影响获得焦点的控件等等。
二、击键产生的消息:
系统键 WM_SYSKEYDOWN WM_SYSKEYUP
非系统键 WM_KEYDOWN WM_KEYUP
系统键由alt+其他键组成,程序一般忽略系统键,并把它直接交给DefWindowProc处理,然后接受处理后的结果。
三、键盘消息
msg.wParam 存放虚拟键码。
msg.lParam 存放其他信息。
四、虚拟键码。
对于键盘硬件来说,按键是按照键的物理顺序编码的,但程序中不这样,所以有一套对应的虚拟键码。
VK_开头的,可以在程序中查看定义的地方看。
ctrl + pause break = esc
五、lParam信息:
31位 : 转换状态 --- 正在被按下OR释放
30位 : 键先前的状态
29位 : 环境代码 -- 是否按下ALT
24位 : 扩展键标志
23-16位:OEM扫描吗
15-0位:重复计数 -- 有几下没处理的按键消息
取出某一位的算法: 0x80000000 & msg.lParam
六、检测某按键是否按下:
GetkeyState(CK_SHIFT)。如果结果的高位被置位,也就是为负,就表示按下:
if (GetKeyState(VK_SHIFT)<0)
if (HIWORD(GetKeyState(VK_SHIFT)))
七、击键消息和字符消息。
WM_KEYDOWN 产生 WM_CHAR
八、插入符函数
CreateCaret
SetCaretPos
GetCaretPos
ShowCaret
HideCaret
DestroyCaret
GetCaretBlinkTime
SetCaretBlinkTime