C ++-Windows-从任务管理器中捕获进程

问题描述

当我们的程序被任务管理器杀死后,我需要停止服务。

我尝试使用std::signal(...)_onexit(...),但是它不起作用。

我尝试运行ProcessMonitor,因此检查了我可以捕获的某种信号,但是没有找到。

我尝试过:

    auto serviceStopThread = QThread::create([](){
        ::WaitForSingleObject(::GetCurrentProcess(),INFINITE);
        ServiceUtils::stopService();
    });
    serviceStopThread->start();

但它什么也没做。

我该怎么办?

解决方法

当进程仍然存在时,找到PID,然后用OpenProcess打开它。您至少需要SYNCHRONIZE权限。

然后等待手柄发出信号。例如,您可以启动一个新线程,并在WaitForSingleObject超时的情况下调用INFINITE。无论原因为何,只要退出该过程,该句柄就会发出信号。

根据需要进行反应,但不要忘记在完成后打电话给CloseHandle

如果您只想在进程突然终止时做出反应,请在程序正常退出时向监督进程发送一些消息,以禁用处理。