我编写了一个简单的测试程序 (TestProgram.exe) 来学习如何处理 CTRL_CLOSE_EVENT,这是我的观察结果和我的问题:
1) 当我双击 TestProgram.exe 启动它时,如果我现在转到任务管理器,TestProgram.exe 会列在“应用程序”下。当我在 TestProgram.exe 上执行“结束任务”时,将调用我的 CTRL_CLOSE_EVENT 处理程序。
但是
2) 当我打开命令提示符并启动 TestProgram.exe 时,它列在任务管理器下的“后台进程”下,并且对其执行“结束任务”不会导致 CTRL_CLOSE_EVENT。
我的真实应用是按照上面案例2)中的描述使用的。当用户在我的应用程序上执行结束任务时(在任务管理器中的后台进程下列出),我想做一些清理工作。
谢谢, 奎师那
最佳答案
一般来说,当一个进程被列为“应用程序”时,这意味着任务管理器检测到该进程有一个 GUI,并且 GUI 上的“结束任务”将首先尝试通过标准 WM_CLOSE
正常关闭 GUI 和/或 WM_QUIT
消息,然后通过 TerminateProcess()
强制终止 GUI 进程。另一方面,对“后台进程”执行“结束任务”将立即执行暴力终止。
因此,在您的情况下,双击 .exe 文件会产生一个新的专用控制台进程,该进程本身仅运行您的应用程序,因此控制台的 GUI 会被标记为“应用程序”,但是当您打开控制台时首先打开窗口并通过命令行执行您的 .exe,您的应用程序在现有控制台中运行并共享控制台的原始 GUI,因此您的应用程序没有自己的 GUI,因此被标记为“后台进程”。
关于c++ - 如何在后台进程中处理来自 Windows 任务管理器的 "End Task"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18454763/