功能说明
当一个线程的消息队列中没有消息存在时,WaitMessage函数会使该线程中断并处于等待状态,同时把控制权交给其它线程,直到被中断的那个线程的消息队列中有了新的消息为止。
函数原型
BOOL WaitMessage(VOID
参数
无。
返回值
如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。
备注
在线程已经调用某个函数来检索其消息队列之后,如果其消息队列中还包含有未经检索过的输入消息,则WaitMessage就一直等待,而不返回,这是因为诸如此类的函数:PeekMessage、GetMessage、GetQueueStatus、WaitMessage、MsgWaitForMultipleObjects以及MsgWaitForMultipleObjectsEx,在检索消息队列时,都要改变消息在队列中的状态,以便于该消息不再被当作新的输入消息。随后调用的WaitMessage,在指定类型的新的输入消息抵达之前,它是不会返回的。目前的未经检索过的输入消息(之前最后一次检索线程消息队列时得到的)会被忽略的。
适用
Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:winuser.h;输入库:user32.lib。
应用举例
创建模态对话框及其消息循环。
int RunModalWindow( HWNDhwndDialog, HWNDhwndParent)
{
BOOL fDone = TRUE;
INT nResult= -1;
if ( hwndParent != NULL) EnableWindow( hwndParent,FALSE); //父窗体不能为有效窗体
MSG msg;
for ( ; fDone =WaitMessage(); ) { // 创建对应对话框窗体之消息循环
while ( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) ) { // 检索消息队列,检索之后删除消息
if ( msg.message ==WM_QUIT ) {
fDone =TRUE;
PostMessage(NULL,WM_QUIT, 0, 0);
break;
}
if ( !IsDialogMessage(hwndDialog, &msg) ) { // 属于该对话框的消息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
// 退出该对话框时,恢复其父窗体为有效窗体
if ( hwndParent != NULL ) EnableWindow( hwndParent, TRUE );
DestroyWindow( hwndDialog ); // 销毁对话框窗口
return nResult;
}
///
while ( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) { // 检索消息队列,检索之后删除消息
这里写的有个错误且风格明显有问题:
for(fDone=TRUE; fDone; WaitMessage())
{
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
......