Win32 getmessage()循环停止执行..!我想在我的应用程序中运行无限循环而不停止...
当鼠标指针在窗口上移动时,程序运行完美,因为它引发了一个事件和getmessage进程,但是当应用程序窗口失去焦点或鼠标没有超过它时,它就停止了!...
我有一个功能需要连续调用,即使win32应用程序最小化或失去焦点...
我正在调用这样的函数......
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
showFrame();
}
我知道,只有当任何事件被引发时,getmessage才会处理它,然后调用showFrame()函数,但我想连续调用该函数...
请告诉我如何实现它或者我需要使用线程?
答案 0 :(得分:0)
GetMessage()
阻止,直到有可用于检索的消息。如果您不想等待,请改用PeekMessage()
:
MSG msg;
do
{
...
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
...
}
...
}
while (...);
您还可以使用GetQueueStatus()
或MsgWaitForMultipleObjects()
来检测何时有可用的消息,然后再检索它们,例如:
MSG msg;
do
{
...
if (GetQueueStatus(QS_ALLINPUT))
{
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
...
}
}
...
}
while (...);
MSG msg;
do
{
...
if (MsgWaitForMultipleObjects(0, NULL, FALSE, 0, QS_ALLINPUT) == WAIT_OBJECT_0)
{
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
...
}
}
...
}
while (...);
或者,您可以使用SetTimer()
向队列发布定期WM_TIMER
消息,然后您的循环可以在每次收到该消息时显示这些消息。
或者,使用标准GetMessage()
循环,并使用单独的线程驱动帧逻辑。每当需要显示一个新帧时,它就可以将用户定义的消息发布到主线程队列,这样你的循环就可以显示该帧。