//
// 本代码可以免费使用,但使用不当造成的一切后果自负.
//
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));
{
_ASSERT(wExitMsg == WM_QUIT || (wExitMsg > WM_USER && wExitMsg < WM_APP));
DWORD dwStart = ::GetTickCount();
MSG msg;
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,就得重新发一遍。
{
// 默认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 );
}
}
{
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
}
::Sleep(0); // 做一个Sleep(0),等一下时间
}
}
return TRUE; //如果等待时间确认到了,就返回FALSE
}
}