MsgSleep,能处理消息的Sleep.

//
// 本代码可以免费使用,但使用不当造成的一切后果自负.
//

inline BOOL  MsgSleep(DWORD dwMilliSeconds, UINT wRemoveMsg=PM_REMOVE, UINT wExitMsg=WM_QUIT);
BOOL  MsgSleep(DWORD dwMilliSeconds, UINT wRemoveMsg, UINT wExitMsg)
{
    _ASSERT(wExitMsg == WM_QUIT || (wExitMsg > WM_USER && wExitMsg < WM_APP));
    DWORD dwStart = ::GetTickCount();
    MSG msg;
    ::Sleep(0);   // Sleep的目的要达到,所以一开始调用Sleep(0),释放控制权
    while(::GetTickCount() - dwStart < dwMilliSeconds)    // 如果时间够了,就不用PeekMessage了,直接退出,如dwMilliSeconds=0;
    {
        // 默认PM_REMOVE,取一个所有类型消息,处理之;但你可以设置wRemoveMsg自己过滤要取的消息。
        if(::PeekMessage(&msg, NULL, 0, 0, wRemoveMsg))
        {
            if (msg.message == WM_QUIT || msg.message == wExitMsg)    //如果碰到指定消息,就不再Sleep,默认WM_QUIT
            {
                if (msg.message == WM_QUIT)
                    ::PostQuitMessage((int)msg.wParam);// 如果是WM_QUIT,就得重新发一遍。
                return FALSE;   //如果等待时间没有到,就返回FALSE
            }
            if (wRemoveMsg != PM_NOREMOVE)    //如果指定PM_NOREMOVE,就表明不处理消息,和Sleep功能一样了。
            {
                ::TranslateMessage( &msg );
                ::DispatchMessage( &msg );
            }
        }
        ::Sleep(0);   // 做一个Sleep(0),等一下时间
    }
    return TRUE;   //如果等待时间确认到了,就返回FALSE
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值