WindowProc 调用时序

WindowProc Invocation Timing

我是 win32 消息的新手。我想知道当 WindowProc 正在处理一条消息时,是否有可能被中断以处理另一条消息?下面举个例子,如果[A]和[B]都被执行了,WindowProc是不是可以中断处理新的WM_ACTIVATEand/orWM_ACTIVATEA​​PP消息(作为一个[A] 和 [B] 之间 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;
    ...
}

感谢任何评论!

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

事实上,如果您想 运行 您的 windows(或工作人员)彼此并行,则需要创建单独的线程。

没有。这就是 GUI 线程 的要点 - 它是一个线程一次做一件事。如果您正在处理消息,则不会调用 GetMessage.