MFC-用系统快照来枚举进程

用到的函数和结构体如下:

  //失败返回INVALID_HANDLE_VALUE
  HANDLE WINAPI CreateToolhelp32Snapshot(
  DWORD dwFlags,     //用来指定“ 快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
  DWORD th32ProcessID//一个进程ID号,用来指定要获取哪一个进程的 快照,当获取系统进程列表或获取 当前进程快照时可以设为0
);
  //TRUE成功,FALSE失败
  //查找第一个系统进程
  BOOL WINAPI Process32First(
  HANDLE hSnapshot,    //快照句柄
  LPPROCESSENTRY32 lppe//进程信息结构
);
  //查找下一个进程
  BOOL WINAPI Process32Next(
  HANDLE hSnapshot,
  LPPROCESSENTRY32 lppe
);

PROCESSENTRY32:
用来存放快照进程信息的一个结构体。(存放进程信息和调用成员输出进程信息)用来Process32First指向第一个进程信息,并将进程信息抽取到PROCESSENTRY32中。用Process32Next指向下一条进程信息。

typedef struct tagPROCESSENTRY32 {
  DWORD dwSize;             //结构的大小
  DWORD cntUsage;           //此进程的引用计数,这个成员不再被引用,设为0
  DWORD th32ProcessID;      //PID
  DWORD th32DefaultHeapID;  //进程默认堆ID,不再被使用,设为0
  DWORD th32ModuleID;       //进程模块ID,不再被使用,设为0
  DWORD cntThreads;         //此进程开启的线程计数
  DWORD th32ParentProcessID;//父进程ID
  LONG  pcPriClassBase;     //线程优先权
  DWORD dwFlags;            //不再被使用,设为0
  TCHAR szExeFile[MAX_PATH];//进程全名
  DWORD th32MemoryBase;     //加载可执行文件的地址
  DWORD th32AccessKey;
  } PROCESSENTRY32;
  typedef PROCESSENTRY32* PPROCESSENTRY32;
typedef PROCESSENTRY32* LPPROCESSENTRY32;

这个例子的效果如图:
MFC-用系统快照来枚举进程_第1张图片

1.给列表添加列头

    m_list.InsertColumn(0, TEXT("进程名称"), 0, 150);
    m_list.InsertColumn(1, TEXT("PID"), 0, 100);

2.查找进程并显示出来

    //创建进程快照
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(
        TH32CS_SNAPPROCESS,  //创建所有进程的快照
        0                    //0表示当前进程
        );
    if (hProcessSnap == INVALID_HANDLE_VALUE)
    {
        AfxMessageBox(TEXT("创建进程快照失败"));
        return;
    }
    //进程信息结构
    PROCESSENTRY32 processEntry32 = { 0 };
    processEntry32.dwSize = sizeof(processEntry32); //计算结构体大小
    //查找第一个进程
    BOOL bFind = Process32First(hProcessSnap, &processEntry32);
    if (!bFind)
    {
        AfxMessageBox(TEXT("没有找到第一个进程"));
        return;
    }

    while (bFind)
    {
        int iCount = m_list.GetItemCount();
        CString s;
        s.Format(TEXT("%s"), processEntry32.szExeFile);
        m_list.InsertItem(iCount, s);
        s.Format(TEXT("%d"), processEntry32.th32ProcessID);
        m_list.SetItemText(iCount, 1, s);
        //查找下一个进程
        bFind = Process32Next(hProcessSnap, &processEntry32);
    }

创建快照的标志:
指定快照中包含的系统内容,这个参数能够使用下列数值( 常量)中的一个或多个。

TH32CS_INHERIT - 声明快照句柄是可继承的。

TH32CS_SNAPALL - 在 快照中包含系统中所有的进程和线程。

TH32CS_SNAPHEAPLIST - 在 快照中包含在th32ProcessID中指定的进程的所有的堆。

TH32CS_SNAPMODULE - 在 快照中包含在th32ProcessID中指定的进程的所有的模块。

TH32CS_SNAPPROCESS - 在 快照中包含系统中所有的进程。

TH32CS_SNAPTHREAD - 在 快照中包含系统中所有的线程。

Const TH32CS_SNAPHEAPLIST = &H1

Const TH32CS_SNAPPROCESS = &H2

Const TH32CS_SNAPTHREAD = &H4

Const TH32CS_SNAPMODULE = &H8

Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)

Const TH32CS_INHERIT = &H80000000

你可能感兴趣的:(mfc,snapshot,系统快照,枚举进程)