检测窗口关闭wndproc外面?

时间:2009-06-12 10:41:25

标签: windows winapi

我目前正在开发一个win32 GUI应用程序,它在窗口线程中完成大部分工作 此线程有时可以被阻止,因为它运行的脚本引擎可以由外部脚本调试器(另一个进程)挂起。这在大多数时候都不是问题,因为它是预期的行为 但是,如果用户试图关闭窗口,应用程序显然会无响应,并且您会收到“此应用程序没有响应...”对话框。
我的计划是定期从“暂停代码”回拨给应用程序,并让它为WM_CLOSE执行PeekMessage,如果是,则终止调试器。不幸的是,根据我的理解,WM_CLOSE直接发送到wndproc。

是否有其他方法可以检测到用户想关闭窗口,而不是重新设计应用程序,这不是一个选项?
例如,是否可以使用PeekMessage检查其他消息?

4 个答案:

答案 0 :(得分:1)

我猜你可以继续在wndproc中处理你的WM_ CLOSE消息,当你收到它时你会调用 PostQuitMessage(),这反过来会生成一个WM_ QUIT消息,而这个消息又会被读取通过 GetMessage() / PeekMessage()

如果你的窗口线程被完全阻止,那你就不走运了。你有几个选择。在“脚本引擎模式”下,线程必须能够定期执行PeekMessage()。

while (IsScripting()) {
    ScriptEngineTimeSlice();
    while (PeekMessage( .. )) {
        TranslateMessage( .. );
        DispatchMessage( .. ); // <-- wnd procedure will be called
        // ..
    }
}

这对你来说可能是个新闻,因为你已经意识到了这一点。但是如果你以某种方式无法让UI线程中断,那么就无法解决这个问题。如果线程被阻止,则被阻止。

答案 1 :(得分:1)

这个怎么样:定期旋转一个消息循环来调度消息队列上的任何消息(这将导致处理鼠标/输入消息,这将生成WM_CLOSE)。在你的应用程序主窗口中,收到WM_CLOSE时设置一个标志,并在旋转循环后检查该标志。

最简单的旋转消息循环以刷新任何待处理消息的情况是:

while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

尽管您的应用框架工作可能已经具有执行此操作的功能。希望这会有所帮助。

答案 2 :(得分:1)

您会考虑添加另一个重新设计应用程序的线程吗?它肯定会让你的生活更轻松!只需让Gui做所有的Gui东西并运行它的消息循环并在另一个线程中完成所有艰苦的工作。如果用户想要退出应用程序,请向他显示一个很好的确定/取消消息并相应地暂停/中止“工作线程”。在这一个线程中处理两个单独的任务 - 使用所有的解决方法 - 将使事情变得更加混乱。祝你好运!

答案 3 :(得分:0)

如果您正在调试,那是不是意味着用户正在调试?为什么他们会对应用程序“没有响应”感到惊讶?无论如何,你可以控制窗口的窗口过程,那么为什么不在那里看WM_CLOSE消息呢?这是你的窗户?