• 进程遍历


    实现原理:

      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;
    }
  • 相关阅读:
    链队列的实现
    LeetCode——Count Complete Tree Nodes
    LeetCode——Lowest Common Ancestor of a Binary Search Tree
    LeetCode——Palindrome Linked List
    中文乱码问题及其解决办法
    LeetCode——Valid Anagram
    TCP/IP网络知识点总结
    深入理解javascript原型和闭包——从【自由变量】到【作用域链】
    AJAX笔试面试题汇总
    前端开发面试知识点大纲
  • 原文地址:https://www.cnblogs.com/ndyxb/p/12912235.html
Copyright © 2020-2023  润新知