做实验项目任务管理器时好多进程信息无法获得
我在列表框里显示进程名字,ID,用户名及内存占用,就像windows的一样,但很多进程的信息获取不了
DWORD dwCount=0;
PWTS_PROCESS_INFO pi={0};
int i=0;
DWORD dwSize=0;
char username[128]={0};
SID_NAME_USE nameuse = SidTypeUser;
CString str;
m_ctllist.DeleteAllItems();
if( WTSEnumerateProcesses(NULL, 0, 1, &pi, &dwCount) ) {
for( i = 0; i < dwCount; i++ )
{
m_ctllist.InsertItem(i,pi[i].pProcessName);
str.Format(_T("%d"),pi[i].ProcessId);
m_ctllist.SetItemText(i,1,str);
memset( username, 0, sizeof(char) * 128 );
dwSize = 128;
if( LookupAccountSid(NULL, pi[i].pUserSid, username, &dwSize, NULL, &dwSize, &nameuse) )
m_ctllist.SetItemText(i,2,username);
else
m_ctllist.SetItemText(i,2,"system");
HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pi[i].ProcessId);
PROCESS_MEMORY_COUNTERS pmc;
GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc));
str.Format("%d",pmc.WorkingSetSize);
m_ctllist.SetItemText(i,3,str);
}
}
WTSFreeMemory(pi);
LookupAccountSid函数在获取用户名时无法得到属于系统进程的用户名,像SYSTEM之类,所以我只能把得不到的都写成system。
更郁闷的是GetProcessMemoryInfo函数也获取不了很多进程的内存占用,有些不属于系统进程的都得不到,请问高手这是为什么呢,我试过关掉360也不行
[解决办法]
权限不够,以管理员权限运行。
同时为了兼容64位下建议使用。
调用GetProcessImageFileName函数,这个函数在Windows XP及其以后的系统中都能使用