(一)关于键盘
1、Windows和键盘驱动程序将硬件扫描码转换为格式消息,不是保存在消息队列中,而是保存在Windows在所谓的“系统消息队列”中,最后将他们放入应用程序的消息队列。
2、击键消息分为WM_KEYDOWN或者WM_SYSKEYDOWN、WM_KEYUP或者WM_SYSKEYUP,非系统击键消息一般指不带alt键的键消息,对所有4类击键消息,wParam是虚拟键代码,表示按下或释放的键,lParam则包含属于击键的其他数据。之所以是虚拟键代码(VK_开头,包括部分鼠标消息也是这样开头的,如VK_LBUTTON),主要是为了保证以与设备无关的方式处理键盘。数字和字母的虚拟键码是ASCII码,Windows程序几乎从不使用这些虚拟键码,实际上,程序依赖与ASCII码字符的字符消息。
3、换挡状态:通过调用GetKeyState函数,你能知道是否按下了换挡键(shift、ctrl和alt)或者开关键(caps lock、num lock、scroll lock)如,iState = GetKeyState(VK_SHIFT)可以判断是否按下了Shift,通常,如果你需要确定用户是否按下了Shift-Tab,则在处理Tab键的WM_KEYDOWN消息时调用嗲有参数VK_SHIFT的GetKeyState,如果GetKeyState的返回值为负,那么你就知道在按下Tab键之前用户按下了SHIFT键。【不能用GetKeyState处理尚未按下的键】。返回为负,说明按下了相应的键。
4、字符消息:TranslateMessage是将击键消息转换为字符消息,字符消息分为四类,wm_char和wm_deadchar消息是从wm_keydown得到的,而wm_syschar和wm_sysdeadchar消息是从wm_syskeydown得到的。当用户按下A键时,产生的消息有三条:wm_keydown,wm_char,wm_keyup,wm_char指示了字符A。对于击键消息和字符消息的处理规则,如果需要读取输入到窗口的键盘字符,那么你可以处理wm_char消息,如果需要读取光标键、功能键、Delete键、insert键、Shift键、ctrl键、alt键,那么我们我们需要处理的是WM_KEYDOWN消息。死键是只针对于给字母加上音调,因为他们本身不产生字符,所以称之为”死键“,如我们用搜狗时的9( 、0)。
5、至于国际键盘那一些东东,由于我自认为还不过国际,所以就暂且不看了。
(二)关于鼠标
1、lParam值包含了鼠标的位置,低位字为x坐标,高位字为y坐标。wparam值指示了鼠标键以及shift和ctrl键的状态。Mk_前缀代表鼠标键。wparam & mk_shift表示用户是否按下了shift键。wparam & mk_lbutton用于确认用户是否按下了鼠标左键。
2、非客户去消息:在消息中含义字母"NC"的都是表示非客户区消息,非客户去消息的wparam和lparam与客户区消息的wparam和lparam有一些区别,wparam参数指明移动或者单击鼠标键的非客户区位置,lparam参数包含了低位字的x坐标和高位字的y坐标,但是这些都是屏幕坐标,当然我们可以利用ScreenToClient(hwnd,&pt)将屏幕坐标转化为客户区坐标。
3、命中测试消息:WM_NCHITTEST,优先级最高,Windows用WM_NCHTITEST消息产生所有其他鼠标消息。
4、个人认为比较实用的,那就是捕获鼠标:所谓捕获鼠标,就是一个窗口过程通常只在鼠标光标位于窗口的客户区或非客户区上时才接收鼠标消息,一个程序也可能需要在窗口外时接收鼠标消息,如果是这种情况,就需要捕获鼠标。调用SetCapture(hwnd);之后,Windows将所有鼠标消息发送给窗口句柄为hwnd的窗口过程,释放鼠标是可以调用ReleaseCapture();来恢复正常处理。在win32中,只有当鼠标键在你的客户区中被按下时才捕获鼠标;当键被释放是,才释放鼠标捕获。
吃饭去了,下午看一下计时器和c++之类的东西。。。