系統中運行的進程實際上比我們在任務管理器("Ctrl+Alt+Del"對話框)中看到的要多,有些惡意的程序是無法在任務欄和任務管理器中看到的。本文介紹如何顯示系統當前運行的所有進程,及如何終止運行的進程。
運行程序,點按鈕"獲取進程",則系統當前運行的所有進程名稱以及進程對應的ID、涉及的線程數、優先級便顯示在列表視圖裡面了。圖一是程序運行效果圖。
圖一 運行效果圖
1.基本原理
系統中有個進程鏈表,用來保存當前運行的所有進程的信息,程序首先調用函數CreateToolhelp32Snapshot獲得進程鏈表的句柄,然後調用函數ProcessFirst和ProcessNext獲得進程結構PROCESSENTRY32,進程的信息都包括在其中。終止一個進程,首先調用OpenProcess函數獲得指定函數的句柄,然後調用函數TerminateProcess使指定進程結束。
2.幾個API函數說明:
(1)HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,DWORD th32ProcessID);
功能:獲得某一時刻系統中由dwFlags標識的進程、堆(heap)、模塊(module)或線程的快照信息。
參數說明:
dwFlags:指明返回的是哪一種快照的句柄。
Th32ProcessID:當取TH32CS_SNAPHEAPLIST和TH32CS_SNAPMODULE時才有用。
(2)HANDLE OpenProcess(DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId);
功能:返回指定進程的句柄。
參數說明:
dwDesiredAccess:指定對指定進程的操作。
bInheritHandle:指明返回的句柄是否能被繼承。
dwProcessId:指定要打開的進程的ID。
(3)BOOL WINAPI Process32First(HANDLE hSnapshot,
LPPROCESSENTRY32 lppe);
功能:獲得系統進程鏈表中第一個進程的信息。
參數說明:
hSnapshot:調用獲得的CreateToolhelp32Snapshot快照句柄。
lppe:指向PROCESSENTRY32進程結構,該結構保存有該進程的相關信息。
(4)BOOL WINAPI Process32Next(HANDLE hSnapshot,
LPPROCESSENTRY32 lppe);
功能:獲得系統進程鏈表中下一個進程的信息。
3.開發步驟
(1)使用AppWizard生成一個基於對話框的MFC應用程序。
(2)編輯主對話框,添加按鈕"獲取進程"和"終止進程",添加List Control控件,按鈕和 List Control 控件的設置見附帶源代碼。
(3)向類CshowAllProcessDlg中添加成員變量:
DWORD m_ProcessIndex[50];//存放所有進程的ID
(4)分別為按鈕"獲取進程"和"終止進程"添加消息處理函數OnGetProcess()和OnStopProcess()。對話框的初始化以及消息響應的實現請參見附帶源代碼。
4.注意
(1)本文中的涉及的幾個API函數聲明包含在頭文件"TLHELP32.H"中,所以必須在ShowAllprocessDlg.cpp中加入:
#include "TLHELP32.H"
(2)有的進程是系統不允許終止的,所以進程是否正常終止要加系統對話框判斷。
(3)在調用Process32First和Process32Next前,必須將PROCESSENTRY32參數的成員變量dwSize設置為PROCESSENTRY32結構的大小。
本文配套源碼