回 帖 发 新 帖 刷新版面

主题:有关SendMessage???

击键操作后,WINDOWS 会发出KEY_DOWN消息给窗口函数,
完后是自动更新客户区,还是需要SendMessage函数执行?

回复列表 (共4个回复)

沙发

当发生击键动作时,实际上是有二个事件发生,第一是KEY_DOWN(包含连续按键的延迟时间),第二是KEY_UP。在两个事件你必须在相应的回调窗口的case中添加处理代码,不必使用SendMessage函数。

板凳

我试了这种情况(向客户区显示我所击键的虚拟键码):
当我击键一次后,WINDOWS 会发出WM_DOWN 消息,开始我没有发出
WM_PAINT消息,执行后没有东西在客户区显示,当我发出InvalidateRect
消息时,居然显示出来了,这是不是说明WM_DOWN消息做完后不会重新
绘制用户区啊?

3 楼

还有一个问题?

如果击键是一个可显示字符时,首先是产生一个击键消息,这时WINDOWS 是
向窗口函数发消息呢,还是等到TranslateMessage 执行完毕后再一起做字符消息发送?


同样我在试上面的程序时,得到的结果是只有字符消息发送!

4 楼

先由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)等形式给出。

我来回复

您尚未登录,请登录后再回复。点此登录或注册