WaitMessage

来源:互联网 发布:无限极会员展示php 编辑:程序博客网 时间:2024/06/15 08:38

功能说明

当一个线程的消息队列中没有消息存在时,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;

}

 

///////////////////////////
for ( fDone = FALSE; fDone; WaitMessage() ) { // 创建对应对话框窗体之消息循环

while ( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) { // 检索消息队列,检索之后删除消息

这里写的有个错误且风格明显有问题:
for(fDone=TRUE; fDone; WaitMessage())
{
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
......
////////////////////
原创粉丝点击