使用CreateToolHelp32Snapshot函数列出所有进程

列出所有进程,需要调用CreateToolHelp32Snapshot函数先得到系统进程快照的句柄,函数包含在<tlhelp32.h>头中。函数的具体格式如下:

[cpp]  view plain  copy
  1. HANDLE_WINAPI CreateToolHelp32Snapshot(  
  2.                                        DWORD dwFlags,  
  3.                                        DWORD th32ProcessID  
  4.                                       );  
其中各个参数含义如下:

dwFlags:指定了获取系统进程快照的类型;

th32ProcessID:指向要获取进程快照的ID,获取系统内所有进程快照时是0;

如果函数调用成功返回快照句柄,否则返回INVALID_HANDLE_VALUE。在得到系统进程快照句柄之后,需要调用Process32First函数查找系统进程快照中的第一个进程。函数格式如下:

[cpp]  view plain  copy
  1. BOOL Process32First(  
  2.                     HANDLE hSnapshot,  
  3.                     LPROCESSENTRY32 lppe  
  4.                    );  
再调用Process32Next函数列出系统中其它进程,格式如下:

[cpp]  view plain  copy
  1. BOOL Process32Next(  
  2.                     HANDLE hSnapshot,  
  3.                     LPROCESSENTRY32 lppe  
  4.                    );  
两个函数的参数是一样的,其中hSnapshot是由CreateToolHelp32Snapshot函数返回的系统进程快照的句柄;而lppe是指向PROCESSENTRY的结构体指针,进程的详细信息保存在结构体中。PROCESSENTRY32结构体定义如下:

[cpp]  view plain  copy
  1. typedef struct tagPROCESSENTRY32 {  
  2.                                   DWORD dwSize;//结构大小  
  3.                                   DWORD cntUsage;//此进程的引用计数  
  4.                                   DWORD th32ProcessID;//进程ID  
  5.                                   DWORD th32DefaultHeapID;//进程默认堆ID  
  6.                                   DWORD th32ModuleID;//进程模块ID  
  7.                                   DWORD cntThreads;//此进程开启的线程计数  
  8.                                   DWORD th32ParentProcessID;//父进程ID  
  9.                                   LONG pcPriClassBase;//线程优先权  
  10.                                   DWORD dwFlags;//保留  
  11.                                   char szExeFile[MAX_PATH];//进程名  
  12.                                 } PROCESSENTRY32;  
当上述两个函数列举到进程时返回TRUE,否则返回FALSE。当列举到一个进程时lppe参数就会返回进程的详细信息,所以用户就可以读取这些进程的信息,然后输出。

列举完后,需要调用CloseHandle函数关闭系统进程句柄。具体代码如下:

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include <windows.h>  
  3. #include <string.h>  
  4. #include <tlhelp32.h>  
  5. int GetProcess()  
  6. {  
  7.     //PROCESSENTRY32结构体,保存进程具体信息  
  8.     PROCESSENTRY32 pe32;  
  9.     pe32.dwSize = sizeof(pe32);  
  10.     //获得系统进程快照的句柄  
  11.     HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
  12.     if (hProcessSnap == INVALID_HANDLE_VALUE)  
  13.     {  
  14.         printf("CreateToolhelp32Snapshot error.\n");  
  15.         return 0;  
  16.     }  
  17.     //首先获得第一个进程  
  18.     BOOL bProcess = Process32First(hProcessSnap, &pe32);  
  19.     //循环获得所有进程  
  20.     while (bProcess)  
  21.     {  
  22.         //打印进程名和进程ID  
  23.         printf("%ls----%d\n", pe32.szExeFile, pe32.th32ProcessID);  
  24.         bProcess = Process32Next(hProcessSnap, &pe32);  
  25.     }  
  26.     CloseHandle(hProcessSnap);  
  27.     return 0;  
  28. }  
  29. int main()  
  30. {  
  31.     GetProcess();  
  32.     return 0;  
  33. }  

结果如图:

猜你喜欢

转载自blog.csdn.net/vevenlcf/article/details/80195931