如何枚举出所有进程和线程以及进程信息

本文介绍了一个C++程序,该程序利用Windows API函数枚举系统中所有进程的信息,包括进程名称、进程ID、线程数及内存使用情况,并进一步获取每个进程所属的所有线程ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下图是程序运行结果和在cmd下使用tasklist得到的效果图:


以下是代码:

#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <Psapi.h>
#pragma comment(lib,"psapi.lib")
using namespace std;
void EnumThreadID(DWORD dwProcessId){
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessId);
THREADENTRY32 te32 = {0};
te32.dwSize = sizeof(te32);
BOOL bRet = Thread32First(hSnapshot,&te32);
while((bRet = Thread32Next(hSnapshot,&te32))){
if(dwProcessId == te32.th32OwnerProcessID)
cout << "\t->|线程ID:" << te32.th32ThreadID << endl;

}
CloseHandle(hSnapshot);
}
DWORD GetUsedMemory(DWORD dwProcessId){
PROCESS_MEMORY_COUNTERS pmc = {0};
DWORD dwSize = 0;
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);
if(hProcess == INVALID_HANDLE_VALUE){
return -1;
}
BOOL bRet = GetProcessMemoryInfo(hProcess,&pmc,sizeof(pmc));
if(!bRet)
return -1;
CloseHandle(hProcess);
return pmc.WorkingSetSize / 1024;
}
void EnumProcessInfo(){
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 pe32 = {0};
pe32.dwSize = sizeof(pe32);


BOOL bRet = Process32First(hSnapshot,&pe32);
while((bRet = Process32Next(hSnapshot,&pe32))){
cout << "进程名称:" << pe32.szExeFile << "\t进程ID:" << pe32.th32ProcessID << 
"\t线程数:" << pe32.cntThreads;
cout << "\t内存使用:" << GetUsedMemory(pe32.th32ProcessID) << "K" << endl;
EnumThreadID(pe32.th32ProcessID);
}


CloseHandle(hSnapshot);
}


int main(void){
EnumProcessInfo();
return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值