首先實現枚舉當前系統中所有進程信息,枚舉該進程的核心點在於使用CreateToolhelp32Snapshot()
函數,該函數用於創建系統進程和線程快照,它可以捕獲當前系統中進程和線程相關的信息(如PID、線程數量、線程ID等),在對這些信息進行處理後,可以獲得很多有用的數據,如當前系統中所有正在執行的進程的信息列表,以及每個進程各自的詳細信息(如CPU、內存佔用量等)。
CreateToolhelp32Snapshot 函數原型如下:
HANDLE CreateToolhelp32Snapshot(
DWORD dwFlags, // 快照類型標記
DWORD th32ProcessID // 進程PID,如果打算捕獲系統所有進程的信息,則爲0
);
參數說明:
- dwFlags:表示快照類型標記。可以爲TH32CS_SNAPALL、TH32CS_SNAPPROCESS或TH32CS_SNAPTHREAD。其中:
- TH32CS_SNAPPROCESS:捕獲當前系統中所有進程的信息;
- TH32CS_SNAPTHREAD:捕獲當前系統中所有線程的信息;
- TH32CS_SNAPALL:捕獲當前系統中所有進程和線程的信息;
- th32ProcessID:進程PID,如果打算捕獲系統所有進程的信息,則爲0。
函數的返回值是一個句柄,它指向一個新創建的進程快照。如果函數調用失敗,函數返回INVALID_HANDLE_VALUE。這個函數通常與Process32First()
和Process32Next()
一起使用,用於枚舉進程和線程信息的快照。通過使用創建的進程快照句柄和枚舉處理函數,可以獲取當前系統中所有進程或線程的詳細信息。
- Process32First 獲取快照中第一條記錄,即第一個進程的信息,執行成功返回TRUE,並把第一個進程信息寫入傳入參數PE32指定的結構體中;
- Process32Next 獲取下一個進程的信息,執行成功返回TRUE,並把下一個進程信息寫入傳入參數PE32指定的結構體中;
#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>
int EnumProcess()
{
PROCESSENTRY32 pe32 = { 0 };
pe32.dwSize = sizeof(PROCESSENTRY32);
// 獲取全部進程快照
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE != hProcessSnap)
{
// 獲取快照中第一條信息
BOOL bRet = Process32First(hProcessSnap, &pe32);
while (bRet)
{
printf("進程ID: %-5d --> 進程名: %s \n", pe32.th32ProcessID, pe32.szExeFile);
// 獲取快照中下一條信息
bRet = Process32Next(hProcessSnap, &pe32);
}
CloseHandle(hProcessSnap);
}
return -1;
}
int main(int argc,char * argv [])
{
EnumProcess();
system("pause");
return 0;
}
上述代碼可用於枚舉輸出當前系統中所有的正在運行進程列表,通過在枚舉過程中增加一個_tcsicmp()
函數,判斷pe.szExeFile
與szProcessName
兩者的值我們就可以實現取特定進程的PID,如下代碼所示則可實現取QQ進程的PID信息。
#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>
#include <tchar.h>
DWORD FindProcessID(LPCTSTR szProcessName)
{
DWORD dwPID = 0xFFFFFFFF;
HANDLE hSnapShot = INVALID_HANDLE_VALUE;
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
Process32First(hSnapShot, &pe);
do
{
if (!_tcsicmp(szProcessName, (LPCTSTR)pe.szExeFile))
{
dwPID = pe.th32ProcessID;
break;
}
} while (Process32Next(hSnapShot, &pe));
CloseHandle(hSnapShot);
return dwPID;
}
int main(int argc,char *argv[])
{
DWORD PID = FindProcessID(L"qq.exe");
printf("該進程PID是: %d \n", PID);
system("pause");
return 0;
}
本文作者: 王瑞
本文鏈接: https://www.lyshark.com/post/54a95c77.html
版權聲明: 本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!