进程遍历

实现原理:

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

 

进程遍历

上一篇:Ubuntu删除多余的内核


下一篇:linux++:基本操作命令