关于windows API编程中的消息循环的问题
MSGmsg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);...
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
在这段程序中,当系统产生WM_KEYDOWN和WM_KEYUP后,TranslateMessage会将其转换为WM_CHAR消息,然后投递到消息队列中,下一次由GetMessage取出。那么在转换之后,dispatchmessage对原来的消息进行怎样的处理?是忽略吗?下一次取出消息之前,还有没有其他的消息会被处理?也就是说,消息队列中,在原来的和被转换的消息之间,有没有其他的消息? 展开
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
在这段程序中,当系统产生WM_KEYDOWN和WM_KEYUP后,TranslateMessage会将其转换为WM_CHAR消息,然后投递到消息队列中,下一次由GetMessage取出。那么在转换之后,dispatchmessage对原来的消息进行怎样的处理?是忽略吗?下一次取出消息之前,还有没有其他的消息会被处理?也就是说,消息队列中,在原来的和被转换的消息之间,有没有其他的消息? 展开
1个回答
2014-05-21
展开全部
首先对于你的第一个问题:"dispatchmessage对原来的消息进行怎样的处理?是忽略吗"作一解释, 比如说我们按下了D键,将产生d键按下的消息,因为它代表一个字符,所以由TranslateMessage()函数将其翻译成两个消息一个是原来的消息,一个是wm_char消息(所以说是增加和解释而不是忽略),这时dispatchmessage()函数将新产生的消息交给窗口过程函数去处理. 对于最后的问题,答案是显而易见的,你应该思考为什么是消息队列,而不是消息堆栈,既然是队列,就该遵循队列的特点,先进先出,按着顺序来.所以是没有其他消息被传递的,当然这只是相对与同一个窗口的消息队列而言,对于多个窗口的消息,用的是多线程的机制.在这期间是有其他的消息的.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询