读书人

消息循环的小疑点

发布时间: 2012-02-29 16:44:10 作者: rapoo

消息循环的小问题!
关于消息循环

Msg msg
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

对于
GetMessage(&msg,NULL,0,0)
TranslateMessage(&msg);
DispatchMessage(&msg);

孙鑫的书上说:
GetMessage:
从消息队列中取出消息-> TranslateMessage.TranslateMessage 用于将虚拟键消息转换为字符消息,字符消息被投递到调用线程的的消息队列中,当下次调用GetMessage函数时被取出。TranslateMessage 并不会修改原有的消息,它只是产生新的消息并投递到消息队列中。
DispatchMessage函数分派一个消息到窗口过程,由操作系统调用窗口过程函数对消息进行处理(相应)

我的疑问是:

下面这句话我有疑问:
TranslateMessage 用于将虚拟键消息转换为字符消息,字符消息被投递到调用
线程的的消息队列中,当下次调用GetMessage函数时被取出。

我的理解是:
TranslateMessage转换消息后(有些消息不转换),该消息又传入DispatchMessage中,发送给窗口过程。

所以下面这句话是不对的吧?:
字符消息被投递到调用
线程的的消息队列中,当下次调用GetMessage函数时被取出(怎么又被取出,应该是已经被DispatchMessage发给了窗口过程了)。

各位朋友考虑考虑??


[解决办法]
TranslateMessage翻译的,
DispatchMessage是把消息投递到消息队列的
[解决办法]
DispatchMessage是把消息投递到消息队列的
---------
这个是错误的, 消息刚刚被GetMessage从消息队列中取出来呢,嘿嘿
[解决办法]
DispatchMessage是把消息交给windows操作系统, 操作系统根据MSG中的HWND句柄确定调用哪个窗口的窗口过程.
[解决办法]
所以下面这句话是不对的吧?:
字符消息被投递到调用
线程的的消息队列中,当下次调用GetMessage函数时被取出(怎么又被取出,应该是已经被DispatchMessage发给了窗口过程了)。
-----------
这个是没错的, TranslateMessage将按键消息转换为字符消息WM_CHAR, 下次得到WM_CHAR之后, TranslateMessage就不会对它有进一步的动作了(否则这里必然产生大量的冗余). 然后DispatchMessage就派上用场啦.
[解决办法]
关注
[解决办法]
dispatchMessage分发的消息当然是从GetMessage中取出的!
下面是windows核心编程里的两段话,楼主可以看看!
dispatchMessage函数检查是否有一个WM_KEYDOWN或一个WM _SYSKEYDOWN消息从输入队列中出。如果有一个这样的消息被取出,系统检查虚键(virtual key)信息是否能转换成等价的字符。如果虚键信息能够转换,
TranslateMessage调用PostMessage将一个WM_CHAR消息或一个WM_SYSCHAR消息放置在登
记消息队列中。下次调用GetMessage时,系统首先检查登记消息队列中的内容,如果其中有消
息存在,从队列中取出消息并将其返回。返回的消息将是WM_CHAR消息或WM_SYSCHAR消息。再下一次调用GetMessage时,系统检查登记消息队列,发现队列已空。系统再检查输入队
列,在其中找到WM_(SYS)KEYUP消息。GetMessage返回这个消息。
由于系统是按这种方式工作,下面的硬件事件序列WM _KEYDOWN、WM_KEYUP生成
下面的到窗口过程的消息序列:
WM_KEYDOWN
WM_CHAR
WM_KEYUP

读书人网 >VC/MFC

热点推荐