如何检测主线程的窗口破坏?

时间:2011-02-19 20:51:02

标签: windows winapi

通常,“主”窗口类的窗口过程将调用PostQuitMessage以响应WM_DESTROY消息。

我希望主线程根据它创建的窗口的生命周期决定何时终止。这样,无论我选择哪个窗口类作为主窗口,都可以有一个没有PostQuitMessage的通用窗口过程。

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

    if(msg.hwnd == hWnd && msg.message == WM_DESTROY)
    {
        PostQuitMessage(0);
    }
}

以上是我的尝试,但WM_DESTROY消息从未发布到消息队列,它似乎是窗口过程的内部。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:5)

WM_DESTROY正在发送而不是发布,这就是为什么它永远不会进入消息队列。如果它最终出现在WndProc中,并且没有通过消息泵,那么还有其他解释吗?

通过调用DestroyWindow来销毁窗口句柄,WM_DESTROY会将WndProc消息直接发送到{{1}}。

我认为你需要为你的潜在主窗口找到一些其他的方法,以决定哪一个是在它被摧毁时将它拉下来的那个。

答案 1 :(得分:1)

我找到了一种似乎可以做我想要的方法。我被Valik的http://www.autoitscript.com/forum/topic/66508-peekmessage-and-wm-close/启发,以调查子类化。

首先,我将我想要的窗口的Window Procedure替换为特殊的“PostQuitMessage”过程。

Original_WindowProc = (WNDPROC)GetWindowLongPtr(hWnd, GWL_WNDPROC);
SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)&WindowProc);

窗口过程如下所示:

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg,  WPARAM wParam,  LPARAM lParam)
{
    if(uMsg == WM_DESTROY)
    {
        PostQuitMessage(0);
    }

    return CallWindowProc(Original_WindowProc, hWnd, uMsg, wParam, lParam);
}

这允许我将任何窗口类(包括系统类)转换为我的应用程序的主窗口。