C++搜索进程列表
首先获取当前系统快照
HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
MessageBox("无法获取进程列表");
return;
}
CreateToolhelp32Snapshot函数原型如下
HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);
dwFlags参数表示获取快照的类型
常量 | 意义 | 值 |
---|---|---|
TH32CS_INHERIT | 表示该句柄可以被继承 | 0x80000000 |
TH32CS_SNAPHEAPLIST | 表示获取th32ProcessID指定进程所有的堆 | 0x00000001 |
TH32CS_SNAPPROCESS | 表示获取系统所有进程 | 0x00000002 |
TH32CS_SNAPTHREAD | 表示获取系统所有线程 | 0x00000004 |
TH32CS_SNAPMODULE | 表示获取th32ProcessID指定进程所有的模块 | 0x00000008 |
TH32CS_SNAPALL | 表示获取系统所有进程和线程,以及h32ProcessID指定进程所有的堆和模块 | 0x0000000f |
th32ProcessID参数指定一个进程ID
返回值为快照句柄。
接着搜索进程列表。
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
BOOL have_more=::Process32First(hProcessSnap,&pe32);
while(have_more)
{
int count = m_listview.GetItemCount();
m_listview.InsertItem(count,"");
char id[64];
sprintf(id,"%d",pe32.th32ProcessID);
char cnt[64];
sprintf(cnt,"%d",pe32.cntThreads);
char paid[64];
sprintf(paid,"%d",pe32.th32ParentProcessID);
m_listview.SetItemText(count,0,id);
m_listview.SetItemText(count,1,pe32.szExeFile);
m_listview.SetItemText(count,2,cnt);
m_listview.SetItemText(count,3,paid);
have_more=::Process32Next(hProcessSnap,&pe32);
}
PROCESSENTRY32结构定义如下
typedef struct tagPROCESSENTRY32
{
DWORD dwSize; // 此结构大小,在调用Process32First前必须将dwSize大小初始化为sizeof(PROCESSENTRY32)
DWORD cntUsage; // 无效,恒为0
DWORD th32ProcessID; // 进程ID
DWORD th32DefaultHeapID; // 无效,恒为0
DWORD th32ModuleID; // 无效,恒为0
DWORD cntThreads; // 进程所包含的线程数
DWORD th32ParentProcessID; // 父进程ID
LONG pcPriClassBase; // 此进程创建的线程默认优先权
DWORD dwFlags; // 无效,恒为0
CHAR szExeFile[MAX_PATH]; // 进程全名,即映像名称
} PROCESSENTRY32;
Process32First原型为
BOOL WINAPI Process32First(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);
hSnapshot参数指定快照句柄
lppe参数指定PROCESSENTRY32结构体的地址,用作返回PROCESSENTRY32结构体
返回值表示是否返回了有效的PROCESSENTRY32结构体。
Process32Next原型为
BOOL WINAPI Process32Next(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);
参数和返回值与Process32First相同
最后,关闭快照句柄。
::CloseHandle(hProcessSnap);
CloseHandle原型为
BOOL WINAPI CloseHandle(HANDLE hObject);
hObject参数表示需要关闭的句柄
返回值True表示成功,False表示失败。可以通过调用GetLastError函数获取错误信息。