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

  • Post author:
  • Post category:其他

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<Windows.h>
#include<TlHelp32.h>
#include<stdio.h>

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.


版权声明:本文为wangqingchuan92原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。