1

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

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

我有一个函数,即使在 win32 应用程序最小化或失去焦点时也需要连续调用......

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

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

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

请给我一个线索我该如何实现它或者我需要使用线程?

4

1 回答 1

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()循环,并有一个单独的线程驱动您的框架逻辑。每当它需要显示一个新框架时,它可以将用户定义的消息发布到主线程队列,以便您的循环可以显示该框架。

于 2013-10-11T22:29:01.163 回答