列出所有进程,需要调用CreateToolHelp32Snapshot函数先得到系统进程快照的句柄,函数包含在<tlhelp32.h>头中。函数的具体格式如下:
- HANDLE_WINAPI CreateToolHelp32Snapshot(
- DWORD dwFlags,
- DWORD th32ProcessID
- );
dwFlags:指定了获取系统进程快照的类型;
th32ProcessID:指向要获取进程快照的ID,获取系统内所有进程快照时是0;
如果函数调用成功返回快照句柄,否则返回INVALID_HANDLE_VALUE。在得到系统进程快照句柄之后,需要调用Process32First函数查找系统进程快照中的第一个进程。函数格式如下:
- BOOL Process32First(
- HANDLE hSnapshot,
- LPROCESSENTRY32 lppe
- );
- BOOL Process32Next(
- HANDLE hSnapshot,
- LPROCESSENTRY32 lppe
- );
- typedef struct tagPROCESSENTRY32 {
- 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;
列举完后,需要调用CloseHandle函数关闭系统进程句柄。具体代码如下:
- #include <stdio.h>
- #include <windows.h>
- #include <string.h>
- #include <tlhelp32.h>
- int GetProcess()
- {
- //PROCESSENTRY32结构体,保存进程具体信息
- PROCESSENTRY32 pe32;
- pe32.dwSize = sizeof(pe32);
- //获得系统进程快照的句柄
- HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- if (hProcessSnap == INVALID_HANDLE_VALUE)
- {
- printf("CreateToolhelp32Snapshot error.\n");
- return 0;
- }
- //首先获得第一个进程
- BOOL bProcess = Process32First(hProcessSnap, &pe32);
- //循环获得所有进程
- while (bProcess)
- {
- //打印进程名和进程ID
- printf("%ls----%d\n", pe32.szExeFile, pe32.th32ProcessID);
- bProcess = Process32Next(hProcessSnap, &pe32);
- }
- CloseHandle(hProcessSnap);
- return 0;
- }
- int main()
- {
- GetProcess();
- return 0;
- }
结果如图: