【发布时间】:2014-04-11 21:20:00
【问题描述】:
除了主 Win32 窗口之外,我还使用“AllocConsole()` 打开了一个控制台窗口。控制台窗口在主窗口之前打开。
当我关闭主窗口并且程序从主函数返回时,控制台保持打开状态(进程也是如此)。它实际上卡在了ntdll 的某个地方,正如调试器在从 Visual Studio 2012 暂停程序时显示的那样。
通过单击X 按钮将其关闭会退出该进程,但使用FreeConsole() 将其关闭则不会,该进程仍无窗口工作。
CloseWindow(GetConsoleWindow()) 不会关闭它,它会最小化它(!?!)。
PostMessage(GetConsoleWindow(),WM_QUIT,0,0) 关闭窗口,但进程仍在工作(视觉上,这与 "FreeConsole()` 相同)。
有时程序会以正确的方式退出,但每次点击X 按钮都有效。
我该如何做与单击X 按钮相同的操作?
【问题讨论】:
-
您不必关闭控制台窗口,当您从主线程返回并退出主线程(以及其他线程)时,它应该会自行消失。如果你没有做一些讨厌的事情,那么控制台窗口不是你的程序卡住的原因。您的程序可能会在没有控制台窗口的情况下挂起,但首先让我们在不分配控制台的情况下进行尝试。卡在 ntdll 中并不一定意味着您的控制台窗口负责,它可能是应用程序的 gui/logic 部分之前完成的某些操作的最终结果。
-
@AlexFarber 据我所知,每个进程只能有一个控制台窗口,但我可能错了。
-
@Vladivarius
CloseWindow()有望最小化窗口(查看文档),它是来自黑暗时代的古老功能,并且被赋予了一个可怕/令人困惑的名称。如果要模拟按下窗口的 X 按钮,请向窗口发送WM_CLOSE消息。 -
那么,您有带有附加控制台的 Windows 应用程序吗?也许你可以通过将应用程序类型更改为 SUBSYSTEM:Console 来获得相同的效果。在这种情况下,您不需要使用 AllocConsole。
-
@pasztorpisti 发表您对 WM_CLOSE 的评论作为答案(或者更好的是,两个 cmets),它起作用了。这就是我想要做的,只是感到困惑并改用 WM_QUIT -.- 另外,程序的其余部分可能有问题,因为 nvoglv32.dll 线程仍在运行并且调用堆栈刚刚成熟,可以调用它并且ntdll。一定是一个非常讨厌的 OpenGL 泄漏:/