環境:VS2010/MFC/對話框html
效果圖:windows
目錄:api
1. 關於windows進程信息獲取函數
2. CListCtrl的使用spa
---------------------------------------------------------線程
1. windows進程信息獲取code
須要包含頭文件orm
#include <psapi.h>
#include <TlHelp32.h>htm
#pragma comment(lib,"Psapi.lib")blog
主要函數使用
CreateToolhelp32Snapshot, Process32First,OpenProcess, GetProcessMemoryInfo,Process32Next。
PROCESSENTRY32結構中保存進程信息,
szExeFile--進程名稱
th32ProcessId--進程Id
cntThreads--進程包含線程數
th32ParentProcessId--父進程ID
pcPriClassBase--線程基礎優先級
內存信息保存在PROCESSMEMORYCOUNTERS中,windows內存項分不少種,下圖是從win7任務管理器的查看--選擇列中所截的圖,
其中,任務管理器上默認顯示的是專用工做集內存,指得是該程序獨有的,不和其餘程序共享的。
這一項不知道怎麼獲取,PROCESSMEMORYCOUNTERS中沒有。程序中暫時用的workingsetsize,包含了可能被其餘程序共享的內存。
按鈕響應代碼:
1 void CSystemProcessDlg::OnBnClickedButton1() 2 { 3 // TODO: 在此添加控件通知處理程序代碼 4 m_listctrl.DeleteAllItems(); 5 HANDLE hSnapshot; 6 //建立進程信息快照 7 hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 8 //進程信息結構體 9 PROCESSENTRY32 pe; 10 //取得第一個 11 Process32First(hSnapshot, &pe); 12 CString str; 13 int i = 0; 14 do 15 { 16 m_listctrl.InsertItem(i, pe.szExeFile); 17 str.Format("%d", pe.th32ProcessID); 18 m_listctrl.SetItemText(i,1,str); 19 20 str.Format("%d", pe.cntThreads); 21 m_listctrl.SetItemText(i,2,str); 22 23 str.Format("%d", pe.th32ParentProcessID); 24 m_listctrl.SetItemText(i,3,str); 25 26 str.Format("%d", pe.pcPriClassBase); 27 m_listctrl.SetItemText(i,4,str); 28 29 //根據進程ID獲取內存使用信息 30 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pe.th32ProcessID); 31 if(hProcess) 32 { 33 //內存信息結構 34 PROCESS_MEMORY_COUNTERS pmc; 35 if (GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc))) 36 { 37 str.Format("%dK", pmc.WorkingSetSize/1024); 38 m_listctrl.SetItemText(i,5,str); 39 } 40 } 41 i++; 42 } 43 while(Process32Next(hSnapshot, &pe)); 44 CloseHandle(hSnapshot); 45 }
2. CListCtrl控件
控件用法參考:http://www.cnblogs.com/lidabo/archive/2012/08/23/2652786.html
直接拖一個List control到界面, 而後須要在屬性中設置:
View選項爲Report模式。
添加一個控件變量CListCtrl m_listctrl;
初始化時在OnInitDialog()中添加:
char *tab[6] = {"進程名稱", "PID", "線程數", "父進程ID", "線程優先級", "內存使用"}; for (int i = 0; i < 6; i++) { //LVCFMT_RIGHT表示文字右對齊,60爲列寬 m_listctrl.InsertColumn(i, tab[i], LVCFMT_RIGHT, 70); } //設置 進程名稱 列寬 m_listctrl.SetColumnWidth(0, 130); m_listctrl.SetColumnWidth(1, 50); m_listctrl.SetColumnWidth(4, 80); m_listctrl.SetColumnWidth(5, 80); //設置擴展樣式爲全行選取,網格,複選框 m_listctrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES);
默認是單列選取,並且除了第一列能夠選,其餘都不能夠選, 默認沒有網格,沒有複選框,經過設置擴展樣式修改。