進程遍歷


實現原理:

  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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM