實現原理:
WIN32 API函數CreateToolhelp32Snapshot不僅可以獲取系統中所有進程的快照,還能獲取系統中所有線程快照、指定進程加載模塊快照、指定進程的堆快照等。所謂的快照是指,當第一次調用某個函數枚舉進程的時候,它便得到了當前系統的進程信息,而第二次試圖得到這個信息的時候,這個信息可能已經發生了變化。所以這個信息就像是一個“照片”,記錄的是過去某個時刻的情況。當調用CreateToolhelp32Snapshot函數獲取進程快照的時候,獲取的便是調用該函數時系統中所有進程列表。可以通過調用Process32First和Process32Next這兩個函數來遍歷列表,從中獲取進程信息。
實現過程:
(1).調用CreateToolhelp32Snapshot 函數獲取所有進程的快照
(2).根據進程快照,調用Process32First和Process32Next遍歷快照,獲取快照信息
(3).關閉快照句柄並釋放資源
實現代碼:
//遍歷進程 BOOL CEnumProcessDlg::EnumProcess() { //包含進程信息的結構體 這個結構體的長度在使用之前必須設置 PROCESSENTRY32 pe = { sizeof(PROCESSENTRY32) }; //創建一個快照 參數一 要獲取的快照類型 參數2 進程ID,此時置0 HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap == INVALID_HANDLE_VALUE) { MessageBox(_T("CreateToolhelp32Snapshot Error")); return FALSE; } // 設置列表的擴展風格 m_List.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); m_List.InsertColumn(0, _T("進程名:"),0,200); m_List.InsertColumn(1, _T("ID"), 0, 100); m_List.InsertColumn(2, _T("優先級"), 0, 100); m_List.InsertColumn(3, _T("父進程ID"), 0, 100); m_List.InsertColumn(4, _T("持有線程數"), 0, 100); //找到第一個進程的信息 參數1 快照句柄 參數2 進程信息 if (Process32First(hSnap, &pe) == TRUE) { CString temp; int i = 0; //循環遍歷其他進程 do { //把進程名添加到行 m_List.InsertItem(i, pe.szExeFile); //把ID添加到行 temp.Format(_T("%d"), pe.th32ProcessID); m_List.SetItemText(i, 1, temp); //把優先級添加到行 temp.Format(_T("%d"), pe.pcPriClassBase); m_List.SetItemText(i, 2, temp); //把父進程ID添加到行 temp.Format(_T("%d"), pe.th32ParentProcessID); m_List.SetItemText(i, 3, temp); //把線程數添加到行 temp.Format(_T("%d"), pe.cntThreads); m_List.SetItemText(i, 4, temp); i++; } while (Process32Next(hSnap, &pe)); } return TRUE; }