Windows消息奇怪

时间:2010-12-22 03:12:43

标签: c++ windows

可能只是某种严重疏忽,但我没有在消息循环中收到任何WM_SIZE消息。但是,我确实在WndProc中收到了它们。我以为windows循环向WndProc发送了消息?

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch(message)
    {
        // this message is read when the window is closed
    case WM_DESTROY:
        {
            // close the application entirely
            PostQuitMessage(0);
            return 0;
        } break;
    case WM_SIZE:
        return 0;
        break;
    }
    printf("wndproc - %i\n", message);
    // Handle any messages the switch statement didn't
    return DefWindowProc (hWnd, message, wParam, lParam);
}

...现在消息循环......

while(TRUE)
{
    // Check to see if any messages are waiting in the queue
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {

        // translate keystroke messages into the right format
        TranslateMessage(&msg);
        // send the message to the WindowProc function
        DispatchMessage(&msg);

        // check to see if it's time to quit
        if(msg.message == WM_QUIT)
        {
            break;
        }
        if(msg.message == WM_SIZING)
        {
            printf("loop - resizing...\n");
        }
    }
    else
    {
        //do other stuff
    }
}

3 个答案:

答案 0 :(得分:7)

如果系统在DefWindowProc中或者在netherworld中的其他地方(即Windows消息队列)中系统向您的窗口发送消息,那么消息循环根本不会看到该消息。

请注意,这仅适用于已发送的邮件。已发布的消息将显示在消息循环中。

如果要过滤所有消息,请使用带有线程ID的SetWindowsHookEx和相应的钩子类型。或者更好的是,在你的WndProc中正确处理它们。

答案 1 :(得分:3)

虽然您已经掌握了大小调整器,但我相信Windows正在运行自己的消息循环。这将调度到您的消息队列,但在调整大小的过程中,您的循环不在图片中。

框架窗口将调用SetCapture以捕获所有后续鼠标消息。然后它会在鼠标移动时调整窗口大小。它还会输出消息循环;你可以在这里看到一些类似的代码:ftp://ftp.ringdale.com/support/Nlynx/Tech%20Support%20Docs/Midrange/EmeraldSeries/ADK/DDE/C/APITERM/TRACK.C。注意该函数中间的消息循环。

它抽取队列本身,以便在调整大小跟踪完成之后不必返回大小调整代码。

编辑:我调出跟踪矩形代码,因为这是窗口调整大小的工作方式,只显示窗口的一个薄矩形轮廓,直到我们得到动态窗口大小调整,整个窗口在您调整大小时动态更新。内部行为可能类似。

编辑2:尽管如此,归功于那些提到发布消息和已发送消息的人...已发送的消息将不会通过消息泵。发送的消息很快就会归结为你的wnd proc的函数调用。除非它们被发送到由不同线程拥有的窗口,否则会变得更加复杂;它们被添加到属于目标线程的消息队列的内部队列中,并在内部处理 - 在返回发布的消息之前 - 在GetMessage内部。将已发送消息的返回值返回到源线程涉及更多的旋转:)

答案 2 :(得分:0)

WM_SIZING和WM_SIZE不是同一条消息。我认为调整窗口大小的普通鼠标操作首先发送WM_SIZING,但是如果某个程序发送WM_SIZE消息,那么你只会在没有WM_SIZING的情况下获得WM_SIZE。