真正可用的获取任意进程的内存使用率 和任务管理器一模一样

void PrintMemCpuInfo()
{
printf("是否显示每个进程内存和cpu信息(Y/N):");
int cChar = getch();

if( cChar != 'Y' && cChar != 'y' ) return ;

printf("\n%-30s%-30s%-30s\n","进程","mem-useage","cpu-useage");

/*PERFORMANCE_INFORMATION pif;
memset(&pif,0,sizeof(pif));
if( GetPerformanceInfo(&pif,sizeof(pif)) == FALSE)
{
printf("error-GetPerformanceInfo:%d\n",GetLastError());
return;
}*/
SYSTEM_INFO si;
GetSystemInfo(&si);

OSVERSIONINFO osvi;//定义OSVERSIONINFO数据结构对象
memset(&osvi, 0, sizeof(OSVERSIONINFO));//开空间 
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);//定义大小 
GetVersionEx (&osvi);//获得版本信息 

//typedef BOOL (WINAPI * JKQueryWorkingSet)(HANDLE,PVOID,DWORD);
//JKQueryWorkingSet jkQueryWorkSet = NULL;
//if (osvi.dwMajorVersion>=6) //vista above
//{
// HMODULE hK32 = LoadLibraryA("Psapi.dll");
// jkQueryWorkSet = (JKQueryWorkingSet)GetProcAddress(hK32,"QueryWorkingSet");
//}
//else
//{
// HMODULE hPsapi = LoadLibraryA("Psapi.dll");
// jkQueryWorkSet = (JKQueryWorkingSet)GetProcAddress(hPsapi,"QueryWorkingSet");
//}

HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hSnap)
{
PROCESSENTRY32 entry={sizeof entry};
for (BOOL bState = Process32First(hSnap,&entry);bState;bState=Process32Next(hSnap,&entry))
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,entry.th32ProcessID);
if (hProcess)
{
DWORD dwMemProcess = 0;
//-------------------------------------------------------------------------------
if (osvi.dwMajorVersion<6)
{
PROCESS_MEMORY_COUNTERS_EX procCnt;
if( GetProcessMemoryInfo(hProcess,(PPROCESS_MEMORY_COUNTERS)&procCnt,sizeof(procCnt)) )
{
dwMemProcess = procCnt.WorkingSetSize*1.0f/1024;
if(dwMemProcess==0) dwMemProcess = 1;
_tprintf("%-30s%u KB\n",entry.szExeFile,dwMemProcess);
}
}
else
{
//-------------------------------------------------------------------------------
PSAPI_WORKING_SET_INFORMATION workSet;
memset(&workSet,0,sizeof(workSet));
BOOL bOk = QueryWorkingSet(hProcess,&workSet,sizeof(workSet));
if(bOk || ( !bOk && GetLastError() == ERROR_BAD_LENGTH) )
{
int nSize = sizeof(workSet.NumberOfEntries) + workSet.NumberOfEntries*sizeof(workSet.WorkingSetInfo);
char* pBuf = new char[nSize];
if (pBuf)
QueryWorkingSet(hProcess,pBuf,nSize);
PSAPI_WORKING_SET_BLOCK* pFirst = (PSAPI_WORKING_SET_BLOCK*)(pBuf+sizeof(workSet.NumberOfEntries));
DWORD dwMem = 0;
for (ULONG_PTR nMemEntryCnt = 0;nMemEntryCnt<workSet.NumberOfEntries;nMemEntryCnt++,pFirst++)
{
if(pFirst->Shared==0) dwMem += si.dwPageSize;
}
delete pBuf;

if(workSet.NumberOfEntries>0)
{
dwMemProcess = dwMem/1024;
_tprintf("%-30s%u KB\n", entry.szExeFile,dwMemProcess);
}
}
}
else
{
printf("error-QueryWorkingSet:%d\n",GetLastError());
}
}

CloseHandle(hProcess);
}
else
{
_tprintf(TEXT("error-process:%s打开失败\n"),entry.szExeFile);
}
}
CloseHandle(hSnap);
}

}


//添加以下头文件

#include <Windows.h>

#include <TlHelp32.h>
#include <Psapi.h>


#pragma comment(lib,"Psapi.lib")



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值