键盘

来源:互联网 发布:linux grep 倒序 编辑:程序博客网 时间:2024/04/30 15:22
 
一.键盘
1.同步:windows将硬件的扫描码转换成消息格式,先传送给系统的消息队列,只有当windows处理完前一个使用者的输入信息之后,再把消息传送给应用程序。为什么要这样做呢?是因为需要同步的缘故:假设用户的输入速度比应用程序的处理速度要快,并且输入的按键中有将输入焦点转移的按键,这时,如果把消息直接的传给某个应用程序的话,则转移焦点后面的消息将无法转到对应的消息队列中。所以要先将键盘消息放入系统队列保存,等处理完前一个输入消息之后再发送一个新的消息到应用程序队列中。
 
2.按键消息
什么是键盘消息
当按下一个键时windows会生成一个WM_KEYDOWN/WM_SYSKEYDOWN消息,释放一个键是会生成一个WM_KEYUP/WM_SYSKEYUP消息,并发送到拥有焦点的消息队列当中。
通常「down(按下)」和「up(放开)」消息是成对出现的。不过,如果您按住一个键使得自动重复功能生效,那么当该键最后被释放时,Windows会给窗口消息处理程序发送一系列WM_KEYDOWN(或者WM_SYSKEYDOWN)消息和一个WM_KEYUP(或者WM_SYSKEYUP)消息。像所有放入队列的消息一样,按键消息也有时间信息。通过呼叫GetMessageTime,您可以获得按下或者释放键的相对时间。
 
系统按键消息:类似WM_SYS***的消息是系统按键消息,一般是与ALT相组合的按键(Alt-Tab或者Alt-Esc)。应用程序一般忽略系统按键消息,由DefWindowProc处理。
如果您想在自己的窗口消息处理程序中加上拦截系统按键的程序代码),那么在处理这些消息之后再传送到DefWindowProc,Windows就仍然可以将它们用于通常的目的。
 
虚拟键码:虚拟键码保存在WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP消息的wParam参数中。目的:达到设备的无关性。而lParam中则是存放着与按键有关的信息,比如:重复按键次数,键的先前状态,转换状态等。
 
归纳如下:多数情况下,您将只为光标移动键(有时也为Insert和Delete键)处理WM_KEYDOWN消息。在使用这些键的时候,您可以通过GetKeyState来检查Shift键和Ctrl键的状态。例如,Windows程序经常使用Shift与光标键的组合键来扩大文书处理里选中的范围。Ctrl键常用于修改光标键的意义。例如,Ctrl与右箭头键相组合可以表示光标右移一个字。
 
3.字符消息
字符消息分为4类
 
字符
死字符
非系统字符
WM_CHAR
WM_DEADCHAR
系统字符
WM_SYSCHAR
WM_SYSDEADCHAR
wParam不是虚拟键码,而是ANSI/UNICODE字符代码。
LParam和按键消息一样,是按键的有关信息。
字符消息一般是夹在按键消息之间的:
例如,如果Caps Lock未打开,而使用者按下再释放A键,则窗口消息处理程序将接收到如表所示的三个消息:
 
消息
按键或者代码
WM_KEYDOWN
「A」的虚拟键码(0x41)
WM_CHAR
「a」的字符代码(0x61)
WM_KEYUP
「A」的虚拟键码(0x41)
 
 
 如果您按下Shift键,再按下A键,然后释放A键,再释放Shift键,就会输入大写的A,而窗口消息处理程序会接收到五个消息,如表所示:
 
消息
按键或者代码
WM_KEYDOWN
虚拟键码VK_SHIFT (0x10)
WM_KEYDOWN
「A」的虚拟键码(0x41)
WM_CHAR
「A」的字符代码(0x41)
WM_KEYUP
「A」的虚拟键码(0x41)
WM_KEYUP
虚拟键码VK_SHIFT(0x10)
Shift键本身不产生字符消息。
处理按键和字符消息的基本规则是:如果需要读取输入到窗口的键盘字符,那么您可以处理WM_CHAR消息。如果需要读取光标键、功能键、Delete、Insert、Shift、Ctrl以及Alt键,那么您可以处理WM_KEYDOWN消息。
 
 
 
 
   
 
原创粉丝点击