实现原理:
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; }