C++ 监听进程结束

2023-11-03

#include <windows.h>
#include <wtsapi32.h>
#pragma comment(lib,"wtsapi32.lib")

#include <iostream>

typedef struct _process_information
{
	HANDLE wait_event;
	HANDLE process_handle;
	int process_id;
}process_information;

void __stdcall on_process_exit_event(void* parameter, unsigned char timer)
{
	if (parameter)
	{
		process_information* info = (process_information*)parameter;

		unsigned long exit_code = 0;
		int ret = GetExitCodeProcess(info->process_handle, &exit_code);
		printf("%d process exit code is %d \n", info->process_id, exit_code);
		
		// 关闭进程句柄
		ret = CloseHandle(info->process_handle);
		ret = UnregisterWait(info->wait_event);
		delete info;
	}
}

bool install_process_exit_event()
{
	bool ret = false;
	DWORD count = 0;
	PWTS_PROCESS_INFOA pi{ 0 };
	if (WTSEnumerateProcessesA(NULL, 0, 1, &pi, &count))
	{
		for (DWORD i = 0; i < count; i++)
		{
			if (GetCurrentProcessId() != pi[i].ProcessId)
			{
				HANDLE h = OpenProcess(THREAD_QUERY_LIMITED_INFORMATION | SYNCHRONIZE, FALSE, pi[i].ProcessId);
				if (h != NULL && h != INVALID_HANDLE_VALUE)
				{
					process_information* info = new process_information;
					info->process_handle = h;
					info->process_id = pi[i].ProcessId;
					if (RegisterWaitForSingleObject(&info->wait_event, h, on_process_exit_event, info, INFINITE, WT_EXECUTEONLYONCE))
					{
						ret = true;
					}
				}
			}
		}
		WTSFreeMemory(pi);
	}

	return ret;
}

bool install_process_exit_event(int process_id)
{
	bool ret = false;

	HANDLE h = OpenProcess(THREAD_QUERY_LIMITED_INFORMATION | SYNCHRONIZE, FALSE, process_id);
	if (h != NULL && h != INVALID_HANDLE_VALUE)
	{
		process_information* info = new process_information;
		if (info)
		{
			info->process_handle = h;
			info->process_id = process_id;
			if (RegisterWaitForSingleObject(&info->wait_event, h, on_process_exit_event, info, INFINITE, WT_EXECUTEONLYONCE))
			{
				ret = true;
			}
		}
	}

	return ret;
}

int main(int argc, char* argv[])
{
	install_process_exit_event();
	printf("%c", getchar());
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 监听进程结束 的相关文章

  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • Git 配置:设置用户名(user.name)和 邮箱(user.eamil)

    Git 配置 设置用户名 user name 和 邮箱 user eamil 原因 Git 提交代码时 会要求提供 用户名 和 邮箱 解决方案 配置 全局 user name 和 user email 使所有的 Git 仓库都使用统一的用户
  • Python计算机视觉(二)

    Python计算机视觉 二 图像处理 图像阈值 添加噪音 高斯噪音 椒盐噪音 图像平滑处理 形态学 腐蚀操作 形态学 膨胀操作 开运算与闭运算 梯度运算 图像梯度 Sobel算子 Sobel算子 Scharr算子 laplacian算子 C
  • Eclipse三种文件目录folder,source folder,package的关系及Build Path的作用

    我们在使用Eclipse导入项目时 由于导入的只是普通的文件目录 需要特殊文件 如 classpath或 project或 xml等 帮助我们识别项目目录结构 否则我们会无法运行java程序 但是当我们导入的项目没有这些文件时 又需要我们手
  • 吃透JAVA的Stream流操作,多年实践总结

    在JAVA中 涉及到对数组 Collection等集合类中的元素进行操作的时候 通常会通过循环的方式进行逐个处理 或者使用Stream的方式进行处理 例如 现在有这么一个需求 从给定句子中返回单词长度大于5的单词列表 按长度倒序输出 最多返
  • 一般通用护网保障简单归纳

    一般通用护网保障简单归纳 1 简介 1 1 护网保障 通常每年特定时间 或特殊时期由省政府 市政府牵头承办 各机关单位配合进行的 网络安全实战攻防演练 行动时间通常由承办单位决定 通常为24小时 跨周末进行 行动评比得分排名靠前的队伍予以通
  • selenium的日期定位发送数据

    https blog csdn net huilan same article details 52385401
  • 深入浅出统计学(十一)总体和样本的估计

    基本概念 问题 章节理解 上一章主要讲解如何用样本估计总体参数 这一章主要是讲解如何用总体估计样本的概率分布
  • Java判断对象是否为空(包括null ,"")

    package com gj5u publics util import java util List 判断对象是否为空 author Rex public class EmptyUtil 判断对象为空 param obj 对象名 retu
  • 自动生成网站的工具

    对大部分同学来说 有自己的网站是很酷的事情 我还记得自己第一次亲手搭建个人博客时 真的是满满的成就感 但不得不说 随着技术的发展和开源 如今现成的东西实在太多了 想要拥有个人网站 基本也都不用自己写代码了 几分钟就能轻松搞定 下面就分享一波
  • G++ 添加头文件和库文件,生成动态库和静态库

    1 添加头文件 报错 fatal error h No such file or directory 1 1通过编译指令 I添加 例如头文件位置 home ubuntu include test h 添加方式g main cpp I hom
  • kubernetes下traefik配置http3

    traefik http3介绍 traefik 2 5的rc版本已经开始支持http3 目前版本是2 6 要实现traefik的http3功能有两个注意事项 1 启动traefik的时候要加两个配置 experimental http3 t
  • Android组件化 引用另外一个Android工程, Android studio 把project项目(非moudle)引入另一个项目作为Lib进行调用

    首先创建两个工程 A MyApplication 主工程 B MyModuleTest 被当做lib依赖的工程 为了叙述方便 在下面的用A B来代替原工程名 在B工程下进行如下修改 如果B工程下 也有lib 在这里如 myuitls mod
  • uniapp使用安卓原生插件(包含插件带第三方jar)

    前言 为了公司需要uniapp引用一个第三方的jar包实现相关功能 只好用安卓封装这个第三方jar包 然后自己将api封装实现 再暴露给uniapp使用 第一次研究安卓 若有啥不对的 或者写得不好的地方 请大家指正 努力学习 一直进步 一
  • LocalDate常用技巧

    LocalDate是Java8新增的处理日期的类 使用起来比java utils date方便了许多 记录一些常用技巧 取当前日期 LocalDate today LocalDate now gt 2014 12 24 根据年月日取日期 L
  • Java并发

    Java并发 学习资料 Java并发 知识点概述 Java并发 基础 并行和并发 并行是指 并排行走 或 同时实行或实施 在操作系统中是指 一组程序按独立异步的速度执行 无论从微观还是宏观 程序都是一起执行的 对比地 并发是指 在同一个时间
  • c语言实现单链表的创建(完整版)

    使用c语言实现单链表是考研的重点 但是如何实现却是一个难点 下面是我写的一个简单的创建单链表的代码 include
  • 招投标信息爬虫 (只上最简单的版本,仅用于技术交流)

    import requests url http manager zjzfcg gov cn cms api cors getRemoteResults noticeId 6000337 url http 3A 2F 2Fnotice zc
  • getopt和getopt_long函数

    平时在写程序时常常需要对命令行参数进行处理 当命令行参数个数较多时 如果按照顺序一个一个定义参数含义很容易造成混乱 而且如果程序只按顺序处理参数的话 一些 可选参数 的功能将很难实现 在Linux中 我们可以使用getopt getopt
  • python:二叉树的递归遍历之前序遍历文字详解(基于力扣)

    目录 前言 二叉树 前序遍历 前言 这篇作为自己 理解二叉树递归 的记录 非常适合和我一样的新手朋友 二叉树 关于二叉树 我总结了下面几点 1 二叉树和链表相似 这里只说单链表 链表有一个指针 指向下一个节点 2 二叉树的每一个节点有两个指
  • C++ 监听进程结束

    include