对于一个应用来说,按键和鼠标都是基本的消息。当然,win32也需要独立处理按键消息和鼠标消息。今天,我们就讨论一下按键消息。一般认为,当键盘上一个key按下去之后,os会给app发送三个消息,分别是WM_KEYDOWN、WM_CHAR、WM_KEYUP。WM_KEYDOWN是在key按下去的一刹那发送的,WM_CHAR是os通知app按下去的字符是什么,WM_KEYUP则是key重启返回的时候发送的。
一般情况下,如果是普通的字符信息,比如说0-9、a-z,或者是A-Z,一般只要处理WM_CHAR信息就可以了。但是对于具有特殊含义的key,比如说F1-F12,或者是ctrl、shift、alt、tab、windows这样的key,WM_KEYDOWN和WM_KEYUP也是需要处理的,因为这些按键通常是作为特殊按键和其他按键一起配合使用的,所以在WM_KEYDOWN的时候就要做好状态标记,这样有利于后面的应用。
为了验证我们的想法,大家可以做这样一个实验,
case WM_KEYDOWN:
//MessageBox(NULL, "down", "tips", 0);
break;
case WM_KEYUP:
//MessageBox(NULL, "up", "tips", 0);
break;
case WM_CHAR:
MessageBox(NULL, "char", "tips", 0);
break;
这是在WndProc里面添加的消息函数。大家可以先将MessageBox都注释掉,再一个一个打开。这个时候,就可以观察一下,当一个key按下去的时候,是不是真的会有对话框弹出来。如果对话框弹出来,尽量用鼠标来单击,这样可以避免key的影响。
这里的key只是处理普通的字符,那如何处理输入法给出的字符串信息呢,其实win32在这方面也做好了准备。这个信息就是WM_IME_CHAR相关的信息。大家只要做好WM_IME_CHAR方面的处理,就可以收到输入法提供的字符串信息了。类似的消息还有WM_IME_KEYDOWN、WM_IME_KEYUP、WM_IME_COMPOSITION等等,大家可以具体问题具体分析。
case WM_IME_CHAR:
break;
大家可以自己实际操作试一试。