任务管理器

任务管理器

使用VS、MFC、ListCtrl控件

 

原理

操作系统将所有的进程信息放在一个只读的链表中, 找到这个链表, 读取下来显示即可

 

函数

CreateToolhelp32Snapshot(); // 用来获取系统中正在运行的进程、线程信息, 返回一个句柄
Process32First(); // 获取链表头
Process32Next(); // 遍历链表
OpenProcess(); // 通过进程ID获取进程句柄
Terminateprocess(); // 通过进程句柄杀死进程

 

 

代码

m_lstCtrl.insertColumn(0, L"name", LVCFMT_LEFT, 100);
m_lstCtrl.insertColumn(1, L"threadnum", LVCFMT_LEFT, 100);
m_lstCtrl.insertColumn(2, L"id", LVCFMT_LEFT, 100);
m_lstCtrl.SetExtemdedStyle(LVS_EX_FULLROWSELECT); // 设置风格
void ShowProcess()
{
    WCHAR szbuf[100] = {0};
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (INVALID_HANDLE_VALUE == hSnapShot)
        return ;
    PROCESSENTERY32 pe = {sizeof(PROCESSENTERY32)};
    BOOL bFlag = Process32First(hSnapShot, &pe);
    while (bFlag == true)
    {
        m_lstctrl.InsertItem(0, pe.szExeFile); // 显示到控件上
        _itow_s(pe.cntThreads, szbuf, sizeof(buf), 10);
        m_lstctrl.InsertItem(0, 1, szbuf); // 显示到控件上
        _itow_s(pe.th32ProcessID, szbuf, sizeof(buf), 10);
        m_lstctrl.InsertItem(0, 2, szbuf); // 显示到控件上
        bFlag = Process32Next(hSnapShot, &pe);
    }
}
void OnBnClickedButton1()

{

  int nIndex = m_lstCtrl.GetSlectionMark();

  if (-1 == nIndex) return ;

  CString strProcessId = m_lstCtrl.GetItemText(nIndex, 2);

  HANDLE handle = OpenProcess(PROCESS_TERMINATE, NULL, _wtoi(strProcessId));

  if (handle)

  {

    TerminateProcess(handle, -1);
    lstCtrl.delteItem(nIndex);   } }

 

posted @ 2020-08-15 10:27  x_Aaron  阅读(155)  评论(0)    收藏  举报