WindowProc调用时间

时间:2015-10-01 07:12:13

标签: c++ windows message-queue

我是win32消息的新手。我想知道当WindowProc处理消息时,它是否可能被中断以处理另一条消息?以下面的例子为例,如果同时执行[A]和[B],是否可以中断WindowProc以处理[A]和[A]之间的新WM_ACTIVATE和/或WM_ACTIVATEAPP消息(作为ShowWindow调用的结果) [B]?如果可能的话,是否有任何具体情况如此?

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;
    ...
}

感谢您的任何评论!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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