通常,“主”窗口类的窗口过程将调用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消息从未发布到消息队列,它似乎是窗口过程的内部。
有没有办法实现这个目标?
答案 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);
}
这允许我将任何窗口类(包括系统类)转换为我的应用程序的主窗口。