程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 自制進程管理器

自制進程管理器

編輯:關於VC++

系統中運行的進程實際上比我們在任務管理器("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結構的大小。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved