Win32消息处理API---WaitMessage

    技术2022-05-11  13

    功能说明

    当一个线程的消息队列中没有消息存在时,WaitMessage函数会使该线程中断并处于等待状态,同时把控制权交给其它线程,直到被中断的那个线程的消息队列中有了新的消息为止。

     

    函数原型

    BOOL WaitMessageVOID

     

    参数

    无。

     

    返回值

    如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。

     

    备注

        在线程已经调用某个函数来检索其消息队列之后,如果其消息队列中还包含有未经检索过的输入消息,则WaitMessage就一直等待,而不返回,这是因为诸如此类的函数:PeekMessageGetMessageGetQueueStatusWaitMessageMsgWaitForMultipleObjects以及MsgWaitForMultipleObjectsEx,在检索消息队列时,都要改变消息在队列中的状态,以便于该消息不再被当作新的输入消息。随后调用的WaitMessage,在指定类型的新的输入消息抵达之前,它是不会返回的。目前的未经检索过的输入消息(之前最后一次检索线程消息队列时得到的)会被忽略的。

     

    适用

    Windows NT3.1及以上版本;Windows95及以上版本;Windows CE:不支持;头文件:winuser.h;输入库:user32.lib

     

    应用举例

    创建模态对话框及其消息循环。

     

    int RunModalWindow( HWND hwndDialog, HWND hwndParent )

    {

        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;

    }

     


    最新回复(0)