//
// 本代码可以免费使用,但使用不当造成的一切后果自负.
//
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
}
}

本文介绍了一个自定义的MsgSleep函数,该函数允许程序在等待指定毫秒数的同时处理消息队列中的消息。通过调整参数,可以灵活地控制是否移除消息及指定退出消息类型。这对于需要保持响应性的Windows应用程序非常有用。

被折叠的 条评论
为什么被折叠?



