Windows程序设计:调用API获取当前系统正在运行的进程名称及ID

您所在的位置:网站首页 易语言修改已运行的进程名称 Windows程序设计:调用API获取当前系统正在运行的进程名称及ID

Windows程序设计:调用API获取当前系统正在运行的进程名称及ID

2024-02-18 23:39| 来源: 网络整理| 查看: 265

0x00 前言

文章中的文字可能存在语法错误以及标点错误,请谅解;

如果在文章中发现代码错误或其它问题请告知,感谢!

本例运行系统环境为windows 10,使用VS2010编译运行。

0x01 代码实现 1. 实现思路

取得正在运行的进程名称和ID的代码实现思路如下: 1.使用CreateToolhelp32Snapshot()函数给当前系统执行的进程拍摄快照以获得进程列表; 2.使用Process32First()以及Process32Next()函数遍历列表,将获得的进程名称和ID打印出来。

下面介绍相关函数: 1.CreateToolhelp32Snapshot()用于获取系统内指定的进程快照,也可以获得被这些进程使用的堆、模块和线程的快照。使用方法如下:

HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags; //用来指定快照中需要返回的对象 DWORD th32ProcessID; //一个进程的ID,用来指定要获取哪一个进程的快照 //若想获得系统进程列表或获取当前进程快照时可以设置成0 );

dwFlags参数指定获得列表的类型,其取值如下: (1)TH32CS_SNAPHEAPLIST 枚举th32ProcessID参数指定的进程中的堆。 (2)TH32CS_SNAPMODULE 枚举th32ProcessID参数指定的进程中的模块。 (3)TH32CS_SNAPPROCESS 枚举系统范围内的进程,此时th32ProcessID参数被忽略。 (4)TH32CS_SNAPTHREAD 枚举系统范围内的线程,此时th32ProcessID参数被忽略。 函数执行成功会返回一个快照句柄,否则返回INVALID_HANDLE_VALUE(-1)。 2.Process32First()以及Process32Next()从快照列表中获取进程信息。Process32First()用来获取首次调用,以后由Process32Next()进行循环调用,直到列表被调用完毕,返回FLASE。

BOOL WINAPI Process32First( HANDLE hSnapshot, //快照句柄 LPPROCESSENTRY32 lppe //指向PEOCESSENTRY32结构的指针 ); BOOL WINAPI Process32Nextt( HANDLE hSnapshot, //快照句柄 LPPROCESSENTRY32 lppe //指向PEOCESSENTRY32结构的指针 );

LPPROCESSENTRY32结构体定义如下:

typedef { DWORD dwSize; //结构的长度,需要预先设置 DWORD cntUsage; //进程的引用记数 DWORD th32ProcessID; //进程ID DWORD th32DefaultHeapID;//进程默认堆的ID DWORD th32ModuleID; //进程模块的ID DWORD cntThreads; //进程创建的线程数 DWORD th32ParentProcessID;//进程的父线程ID LONG pcPriClassBase; //进程创建的线程基本优先级 DWORD dwFlags; //内部使用 CHAR szExeFile[MAX_PATH];//进程对应的可执行文件名 }PROCESSENTRY32; 2. 代码实现 // 进程打印.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include #include #include int main(int argc, char *argv[]) { PROCESSENTRY32 pe32; //在使用这个结构之前,先设置它的大小 pe32.dwSize = sizeof(pe32); //给系统内所有的进程拍一个快照 HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if(hProcessSnap == INVALID_HANDLE_VALUE) { printf("CreateToolhelp32Snapshot调用失败\n"); return -1; } //遍历进程快照,轮流显示每个进程的信息 BOOL bMore = ::Process32First(hProcessSnap,&pe32); while(bMore) { printf("进程名称:%ls\n",pe32.szExeFile); printf("进程ID号:%u\n\n",pe32.th32ProcessID); bMore = ::Process32Next(hProcessSnap,&pe32); } //不要忘记清除snapshot对象 ::CloseHandle(hProcessSnap); system("pause"); return 0; }

运行结果: 在这里插入图片描述 以上。

参考文档: 1.张铮,孙宝山,周立天.Windows程序设计(第3版)[M].北京;人民邮电出版社,2018.7.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3