WindowProc调用定时

WindowProc Invocation Timing

本文关键字:定时 调用 WindowProc      更新时间:2023-10-16

我是win32消息的新手。我想知道,当一个窗口进程是在处理一个消息的中间,它是可能被中断,以处理另一个消息?以下面的例子为例,如果[A]和[B]都被执行,是否有可能在[A]和[B]之间中断WindowProc来处理新的WM_ACTIVATE和/或WM_ACTIVATEAPP消息(作为ShowWindow调用的结果)?如果这是可能的,有没有什么特殊的情况使其成为可能?

LRESULT CALLBACK WindowProc(
  _In_ HWND   hwnd,
  _In_ UINT   uMsg,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
{
    ...
    case WM_ACTIVATEAPP:
            if (wParam == FALSE)
            {
                // [A] Do something that would trigger a WM_ACTIVATE or WM_ACTIVATEAPP message to be queued to the message queue
                ShowWindow(hwnd, SW_MINIMIZE);
                // [B] Modify Window Styles
                SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_CLIENTEDGE);
            }
            break;
    ...
}

谢谢你的评论!

No。这就是 GUI线程的意义——它是一个线程一次只做一件事。如果您正在处理消息,则不能调用GetMessage

系统将永远不会调用这个回调函数,而它正在处理另一个消息,因为所有的消息都被放入队列中,并且(无论是你的代码还是你使用的框架,如MFC)一个接一个地退出队列,没有重叠。除非一条消息被处理完,否则控件不会返回到退出队列块。
事实上,您可以安全地将window代码视为单线程。如果你有多个窗口运行在一个应用程序中,它们都是序列化的,并且仍然在单个线程中运行。

实际上你需要创建单独的线程,如果你想并行地运行你的窗口(或工人)。