当App窗口失去焦点时,Win32 getmessage循环停止执行..!我想在我的应用程序中运行无限循环而不停止

时间:2013-10-11 14:19:49

标签: win32gui

当App窗口失去焦点时,

Win32 getmessage()循环停止执行..!我想在我的应用程序中运行无限循环而不停止...

当鼠标指针在窗口上移动时,程序运行完美,因为它引发了一个事件和getmessage进程,但是当应用程序窗口失去焦点或鼠标没有超过它时,它就停止了!...

我有一个功能需要连续调用,即使win32应用程序最小化或失去焦点...

我正在调用这样的函数......

MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    showFrame();
    }

我知道,只有当任何事件被引发时,getmessage才会处理它,然后调用showFrame()函数,但我想连续调用该函数...

请告诉我如何实现它或者我需要使用线程?

1 个答案:

答案 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()循环,并使用单独的线程驱动帧逻辑。每当需要显示一个新帧时,它就可以将用户定义的消息发布到主线程队列,这样你的循环就可以显示该帧。