主题:有关SendMessage???
wsw1983
[专家分:0] 发布于 2005-03-11 22:26:00
击键操作后,WINDOWS 会发出KEY_DOWN消息给窗口函数,
完后是自动更新客户区,还是需要SendMessage函数执行?
回复列表 (共4个回复)
沙发
fresher [专家分:730] 发布于 2005-03-12 19:46:00
当发生击键动作时,实际上是有二个事件发生,第一是KEY_DOWN(包含连续按键的延迟时间),第二是KEY_UP。在两个事件你必须在相应的回调窗口的case中添加处理代码,不必使用SendMessage函数。
板凳
wsw1983 [专家分:0] 发布于 2005-03-12 22:52:00
我试了这种情况(向客户区显示我所击键的虚拟键码):
当我击键一次后,WINDOWS 会发出WM_DOWN 消息,开始我没有发出
WM_PAINT消息,执行后没有东西在客户区显示,当我发出InvalidateRect
消息时,居然显示出来了,这是不是说明WM_DOWN消息做完后不会重新
绘制用户区啊?
3 楼
wsw1983 [专家分:0] 发布于 2005-03-12 23:01:00
还有一个问题?
如果击键是一个可显示字符时,首先是产生一个击键消息,这时WINDOWS 是
向窗口函数发消息呢,还是等到TranslateMessage 执行完毕后再一起做字符消息发送?
同样我在试上面的程序时,得到的结果是只有字符消息发送!
4 楼
Happy.T [专家分:60] 发布于 2005-03-30 21:04:00
先由Windows响应你的按键操作,向应用程序的消息队列发送WM_KEYDOWN或者WM_SYSKEYDOWN消息,在WinMain函数的消息循环中:
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
TranslateMessage函数从WM_KEYDOWN或者WM_SYSKEYDOWN击键消息中取得虚拟键码,如果相应的击键操作产生可显示字符,则TranslateMessage把相应的字符消息马上放入应用程序的消息队列中,在紧随其后的下一个消息循环中发生作用,该字符消息WM_CHAR被发送到相应的窗口函数,紧随其后的下一个消息循环才是WM_KEYUP消息。
WM_CHAR消息是在WM_KEYDOWN和WM_KEYUP消息之间发送给窗口过程的。
会应你的问题,对于用户输入的结果,大部分都是进队消息,以击键消息(如WM_KEYDOWN / WM_KEYUP),击键产生的字符消息(WM_CHAR),鼠标移动消息(WM_MOUSEMOVE)和鼠标按键消息(如WM_LBUTTONDOWN)等形式给出。
我来回复