1 /**********使用*********** 2 CreateToolhelp32Snapshot( ) 3 Process32First( ) 4 Process32Next( ) 5 枚举进程的相关信息 6 **************************/ 7 8 #include "stdafx.h" 9 #include "windows.h" 10 #include "stdio.h" 11 #include "TlHelp32.h" //使用ToolHeap32 工具的头文件 12 13 14 int main( ) 15 { 16 PROCESSENTRY32 hProcessEntry = {0}; //PROCESSENTRY32系统自带的,定义一个结构体变量,用于保存获得进程的信息. 17 hProcessEntry.dwSize = sizeof(hProcessEntry); //这个变量使用之前要先设置大小.类型里面有一个元素是 .dwSize 18 19 BOOL ProcessSnapshotRet;//定义一个布尔变量,用于保存Process32First( )和Process32Next( )各自的返回值. 20 HANDLE hProcessID; //定义一个句柄变量,用于保存获得的系统快照的句柄 21 22 hProcessID = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //获得了进程快照的句柄. 23 //TH32CS_SNAPPROCESS是WINDOWS自带宏.代表这个函数是用于获得 进程的信息. 24 //因为这个CreateToolhelp32Snapshot的第一个参数,是决定了这个函数获得是进程,还是线程,还是模块的信息. 25 26 27 if(hProcessID == INVALID_HANDLE_VALUE) //判断获得系统快照句柄是否成功. 28 { 29 return -1; //如果为否,不成功.就直接退出. 30 } 31 32 ProcessSnapshotRet = Process32First(hProcessID,&hProcessEntry); 33 //通过系统快照的句柄,获得第一个进程的信息,把信息都放在了新定义的结构体变量hProcessEntry里面. 34 //到时候用的话,就直接到hProcessEntry拿就是了. 如果获取信息成功,返回值为1. 35 36 while(ProcessSnapshotRet) //判断第一个进程的信息获取是否成功. 37 { 38 printf("ProcessID is: %d ProcessEXE name is: %s ",hProcessEntry.th32ProcessID, hProcessEntry.szExeFile); 39 //打印了获得的进程ID. 还有它的EXE文件名. 40 41 ProcessSnapshotRet = Process32Next(hProcessID,&hProcessEntry); 42 //继续通过系统快照的句柄,获得下一个进程的信息,把信息都放在了新定义的结构体变量hProcessEntry里面. 43 //到时候用的话,就直接到hProcessEntry拿就是了. 如果获取信息成功,返回值为1. 44 } 45 46 return 0; 47 } 48 49 50 51 52 #if 0 53 /************************************************************ 54 >>>>>>>>>>>>>>>>>>>>>>>>>>> 总结 <<<<<<<<<<<<<<<<<<<<<<<<<<<< 55 ************************************************************/ 56 57 //使用下面3个函数,必须要加头文件 "TlHlep32.h" 58 59 //********************************************************************* 60 //CreateToolhelp32Snapshot函数的原型 61 //作用:获得系统快照的句柄 62 //返回值:HANDLE(句柄类型)的值. 63 HANDLE WINAPI CreateToolhelp32Snapshot( 64 DWORD dwFlags, //DWORD 65 DWORD th32ProcessID //DWORD 66 ); 67 /*--------------------------------------------------------------------*/ 68 69 70 71 //********************************************************************* 72 //Process32First函数的原型 73 //作用:获得从系统快照中获得第一个线程的一些信息,信息都保存在LPPROCESSENTRY32 定义的结构体变量中. 74 //返回值得: TRUR or FALSE 75 BOOL WINAPI Process32First( 76 HANDLE hSnapshot, //HANDLE 句柄型变量 77 LPPROCESSENTRY32 lppe //LPPROCESSENTRY32 结构体型变量 78 ); 79 80 //LPPROCESSENTRY32结构体类型原型 81 typedef struct tagPROCESSENTRY32 82 { 83 DWORD dwSize; //定义一个新的变量new以后一定要设置这个的dwSize的大小 84 //如:一般都是new.dwSize = sizeof(tagPROCESSENTRY32) 85 DWORD cntUsage; 86 DWORD th32ProcessID; // 第一个进程的ID 87 ULONG_PTR th32DefaultHeapID; 88 DWORD th32ModuleID; // associated exe 89 DWORD cntThreads; 90 DWORD th32ParentProcessID; // this process's parent process 91 LONG pcPriClassBase; // Base priority of process's threads 92 DWORD dwFlags; 93 CHAR szExeFile[MAX_PATH]; // Path(环境) 94 } PROCESSENTRY32; 95 typedef PROCESSENTRY32 * PPROCESSENTRY32; 96 typedef PROCESSENTRY32 * LPPROCESSENTRY32; 97 //可以看出,函数获得的线程信息都在LPPROCESSENTRY32 定义的结构体变量中, 98 //所以这个LPPROCESSENTRY32型的变量很重要. 99 /*--------------------------------------------------------------------*/ 100 101 102 103 //********************************************************************* 104 //Process32Next函数的原型 105 //作用:获得从系统快照中获得的下一个进程信息,信息都保存在LPPROCESSENTRY32 定义的结构体变量中. 106 //使用方法和Process32First相似 107 //返回值得: TRUR or FALSE 108 BOOL WINAPI Process32Next( 109 HANDLE hSnapshot, 110 LPPROCESSENTRY32 lppe 111 ); 112 /*--------------------------------------------------------------------*/ 113 #endif