c++ - 如何在后台进程中处理来自 Windows 任务管理器的 "End Task"?

标签 c++ c windows

我编写了一个简单的测试程序 (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/

相关文章:

我们可以将代码放在 .text 部分以外的内存部分吗?

c# - Directory.GetFiles 查找不存在的文件

c++ - 动态内存分配并接受输入

不能声明两个字符指针

javascript - 为什么在嵌入 c++ 的 v8 中运行一个非常简单的脚本会耗尽内存?

c - 如何访问 typedef 的二维数组

windows - MoveFile 是否确保文件在磁盘上移动?

windows - 使用 Ctrl+Alt+Del 获取通知

c++ - 将标题放在项目的 "include"子目录中有什么好处吗?

c++ - 将 VARIANT 转换为字节,反之亦然?