Windows系統編程項目(一)進程管理器

本項目將通過MFC實現一個進程管理器,如下圖詳細信息頁所示:

一.首先創建一個基于對話框的MFC項目,在靜態庫中使用MFC

二.在項目默認的對話框中添加一個列表

三.列表添加變量

四.初始化列表

1.設置列表風格和表頭

2.填充列表內容

我們需要在列表中填充操作系統中運行的各種進程的信息,因此我們需要一個函數幫助我們遍歷運行的進程并獲取相關信息

注意:遍歷進程時所使用的API,我們需要在對話框頭文件中包含相應的頭文件

首先聲明一個遍歷進程填充函數

然后實現這個遍歷進程填充函數

3.完善列表初始化

完成以上代碼書寫以后,便實現了一個簡單的沒有功能的任務管理器

五.功能實現

接下來實現任務管理器的右鍵可以結束進程或打開線程列表。線程列表右鍵結束線程或掛起恢復線程等等功能

1.列表添加一個右鍵消息處理函數

2.添加一個菜單

3.列表實現點擊右鍵彈出菜單

4.實現刷新功能

5.實現結束進程功能

6.實現創建進程功能

以下是我手搓的代碼,建議諸位參考上文的演示,自己也寫一個,有助于加深理解


// 任務管理器Dlg.cpp: 實現文件
//#include "pch.h"
#include "framework.h"
#include "任務管理器.h"
#include "任務管理器Dlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于應用程序“關于”菜單項的 CAboutDlg 對話框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 對話框數據
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 實現
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// C任務管理器Dlg 對話框C任務管理器Dlg::C任務管理器Dlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_MY_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void C任務管理器Dlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST1, m_ProcessList);
}BEGIN_MESSAGE_MAP(C任務管理器Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_NOTIFY(NM_RCLICK, IDC_LIST1, &C任務管理器Dlg::OnRclickList1)ON_COMMAND(ID_32771, &C任務管理器Dlg::OnProcessList)ON_COMMAND(ID_32772, &C任務管理器Dlg::OnKillProcess)ON_COMMAND(ID_32773, &C任務管理器Dlg::OnCreateProcess)
END_MESSAGE_MAP()// C任務管理器Dlg 消息處理程序BOOL C任務管理器Dlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。  當應用程序主窗口不是對話框時,框架將自動//  執行此操作SetIcon(m_hIcon, TRUE);			// 設置大圖標SetIcon(m_hIcon, FALSE);		// 設置小圖標// TODO: 在此添加額外的初始化代碼m_ProcessList.SetExtendedStyle(LVS_EX_AUTOSIZECOLUMNS | LVS_EX_COLUMNSNAPPOINTS | LVS_EX_FLATSB | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);m_ProcessList.InsertColumn(0, L"進程名", LVCFMT_LEFT, 150 );m_ProcessList.InsertColumn(1, L"進程ID", LVCFMT_LEFT, 100);m_ProcessList.InsertColumn(2, L"父進程ID", LVCFMT_LEFT, 100);m_ProcessList.InsertColumn(3, L"線程數", LVCFMT_LEFT, 100);m_ProcessList.InsertColumn(4, L"優先級", LVCFMT_LEFT, 100);m_ProcessList.InsertColumn(5, L"進程路徑", LVCFMT_LEFT, 300);InitProcessList();return TRUE;  // 除非將焦點設置到控件,否則返回 TRUE
}void C任務管理器Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向對話框添加最小化按鈕,則需要下面的代碼
//  來繪制該圖標。  對于使用文檔/視圖模型的 MFC 應用程序,
//  這將由框架自動完成。void C任務管理器Dlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使圖標在工作區矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 繪制圖標dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//當用戶拖動最小化窗口時系統調用此函數取得光標
//顯示。
HCURSOR C任務管理器Dlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void C任務管理器Dlg::InitProcessList()
{HANDLE hSnp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);PROCESSENTRY32 pe = { sizeof(PROCESSENTRY32) };WCHAR wcth32ProcessID[MAX_PATH];//進程IDWCHAR wcth32ParentProcessID[MAX_PATH];//父進程ID WCHAR wccntThreads[MAX_PATH];//線程數WCHAR wcpcPriClassBase[MAX_PATH];//優先級WCHAR wcProcessPath[MAX_PATH];//進程路徑BOOL Success = Process32First(hSnp, &pe);DWORD Index = 0;while (Success){HANDLE Process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);GetModuleFileNameEx(Process, NULL, wcProcessPath, MAX_PATH);if (Process == NULL){swprintf(wcProcessPath, L"System Module");}swprintf(wcth32ProcessID, L"%d", pe.th32ProcessID);swprintf(wcth32ParentProcessID, L"%d", pe.th32ParentProcessID);swprintf(wccntThreads, L"%d", pe.cntThreads);swprintf(wcpcPriClassBase, L"%d", pe.pcPriClassBase);m_ProcessList.InsertItem(Index, pe.szExeFile);m_ProcessList.SetItemText(Index, 1, wcth32ProcessID);m_ProcessList.SetItemText(Index, 2, wcth32ParentProcessID);m_ProcessList.SetItemText(Index, 3, wccntThreads);m_ProcessList.SetItemText(Index, 4, wcpcPriClassBase);m_ProcessList.SetItemText(Index, 5, wcProcessPath);Index++;Success = Process32Next(hSnp, &pe);}}void C任務管理器Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知處理程序代碼POINT pt = {};GetCursorPos(&pt);HMENU hMenu = LoadMenu(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_MENU1));hMenu = GetSubMenu(hMenu, 0);TrackPopupMenu(hMenu, TPM_CENTERALIGN, pt.x, pt.y, 0, m_hWnd, NULL);*pResult = 0;
}void C任務管理器Dlg::OnProcessList()
{// TODO: 在此添加命令處理程序代碼m_ProcessList.DeleteAllItems();InitProcessList();
}void C任務管理器Dlg::OnKillProcess()
{// TODO: 在此添加命令處理程序代碼DWORD dwIndex = (DWORD)m_ProcessList.GetFirstSelectedItemPosition();dwIndex--;CString ProcssID = m_ProcessList.GetItemText(dwIndex, 1);DWORD nProcessID = _ttoi(ProcssID);HANDLE hProcess =  OpenProcess(PROCESS_ALL_ACCESS, NULL, nProcessID);TerminateProcess(hProcess, 1);}void C任務管理器Dlg::OnCreateProcess()
{// TODO: 在此添加命令處理程序代碼CFileDialog file(TRUE, L"exe", L"*.exe", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY, L"可執行文件|*.exe|所有文件|.*", NULL);if (file.DoModal() == IDOK){CString FilePath = file.GetPathName();STARTUPINFO si = {};si.cb = sizeof(STARTUPINFO);PROCESS_INFORMATION pi = {};CreateProcess(FilePath, NULL, NULL, NULL, NULL, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70863.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70863.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70863.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RAG-202502

目錄 RAG場景的坑知識等級金字塔 初級RAG存在的問題高級RAG索前優化檢索優化檢索后優化 優化經驗總結參考 RAG場景的坑 晦澀的專業術語 誤區&#xff1a;在專業領域中。許多文獻和資料中充滿了專業術語&#xff0c;這些術語對于非專業人士&#xff08;甚至是大模型&#xff0…

CDN與群聯云防護的技術差異在哪?

CDN&#xff08;內容分發網絡&#xff09;與群聯云防護是兩種常用于提升網站性能和安全的解決方案&#xff0c;但兩者的核心目標和技術實現存在顯著差異。本文將從防御機制、技術架構、適用場景和代碼實現等方面詳細對比兩者的區別&#xff0c;并提供可直接運行的代碼示例。 一…

STM32-智能小車項目

項目框圖 ST-link接線 實物圖&#xff1a; 正面&#xff1a; 反面&#xff1a; 相關內容 使用L9110S電機模塊 電機驅動模塊L9110S詳解 | 良許嵌入式 測速模塊 語音模塊SU-03T 網站&#xff1a;智能公元/AI產品零代碼平臺 一、讓小車動起來 新建文件夾智能小車項目 在里面…

【Linux】vim 設置

【Linux】vim 設置 零、起因 剛學Linux&#xff0c;有時候會重裝Linux系統&#xff0c;然后默認的vi不太好用&#xff0c;需要進行一些設置&#xff0c;本文簡述如何配置一個好用的vim。 壹、軟件安裝 sudo apt-get install vim貳、配置路徑 對所有用戶生效&#xff1a; …

【Python爬蟲(90)】以Python爬蟲為眼,洞察金融科技監管風云

【Python爬蟲】專欄簡介&#xff1a;本專欄是 Python 爬蟲領域的集大成之作&#xff0c;共 100 章節。從 Python 基礎語法、爬蟲入門知識講起&#xff0c;深入探討反爬蟲、多線程、分布式等進階技術。以大量實例為支撐&#xff0c;覆蓋網頁、圖片、音頻等各類數據爬取&#xff…

【java進階】java多態深入探討

前言 在Java的編程宇宙中,多態是極為關鍵的概念,它宛如一條靈動的紐帶,串聯起面向對象編程的諸多特性,賦予程序宛如生命般的動態活力與高度靈活性。透徹理解多態,不僅是提升代碼質量的關鍵,更是開啟高效編程大門的鑰匙。 一、多態的定義與本質 多態,從概念層面來講,…

17164字符遷移

17164字符遷移 ??難度&#xff1a;中等 &#x1f4d6; &#x1f4da; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int q scanner.nextInt();scanner.next…

強化學習概覽

強化學習的目標 智能體&#xff08;Agent&#xff09;通過與環境&#xff08;Environment&#xff09;交互&#xff0c;學習最大化累積獎勵&#xff08;Cumulative Reward&#xff09;?的策略。 數學抽象 馬爾科夫決策過程&#xff08;MDP&#xff09; 收益 由于馬爾科夫決…

IDEA關閉SpringBoot程序后仍然占用端口的排查與解決

IDEA關閉SpringBoot程序后仍然占用端口的排查與解決 問題描述 在使用 IntelliJ IDEA 開發 Spring Boot 應用時&#xff0c;有時即使關閉了應用&#xff0c;程序仍然占用端口&#xff08;例如&#xff1a;4001 端口&#xff09;。這會導致重新啟動應用時出現端口被占用的錯誤&a…

QT:QPen、QBrush、與圖形抗鋸齒的關聯

QPen QPen 是 Qt 框架中用于定義繪圖時使用的畫筆屬性的類。在使用 QPainter 進行 2D 繪圖時&#xff0c;QPen 可以控制線條的外觀&#xff0c;比如線條的顏色、寬度、樣式&#xff08;如實線、虛線等&#xff09;、端點樣式&#xff08;如方形端點、圓形端點等&#xff09;和…

論文筆記(七十二)Reward Centering(三)

Reward Centering&#xff08;三&#xff09; 文章概括摘要3 基于值的獎勵中心化4 案例研究&#xff1a; 以獎勵為中心的 Q-learning5 討論、局限性與未來工作致謝 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan…

單例模式——c++

一個類&#xff0c;只能有1個對象 (對象在堆空間) 再次創建該對象&#xff0c;直接引用之前的對象 so構造函數不能隨意調用 so構造函數私有 so對象不能構造 如何調用私有化的構造函數: 公開接口調用構造函數 調用構造函數&#xff1a;singleTon instance&#xff1b; 但…

ReentrantLock 底層實現

一、核心概念 1 - CAS CAS&#xff08;Compare-And-Swap&#xff0c;比較并交換&#xff09;操作是一種無鎖的原子操作&#xff0c;它在多線程環境下能夠保證線程安全&#xff0c;主要是通過硬件級別的原子性以及樂觀鎖的思想來實現的。以下詳細介紹 CAS 操作保證線程安全的原…

NLP學習記錄十:多頭注意力

一、單頭注意力 單頭注意力的大致流程如下&#xff1a; ① 查詢編碼向量、鍵編碼向量和值編碼向量分別經過自己的全連接層&#xff08;Wq、Wk、Wv&#xff09;后得到查詢Q、鍵K和值V&#xff1b; ② 查詢Q和鍵K經過注意力評分函數&#xff08;如&#xff1a;縮放點積運算&am…

算法-二叉樹篇08-完全二叉樹的節點個數

完全二叉樹的節點個數 力扣題目鏈接 題目描述 給你一棵 完全二叉樹 的根節點 root &#xff0c;求出該樹的節點個數。 完全二叉樹 的定義如下&#xff1a;在完全二叉樹中&#xff0c;除了最底層節點可能沒填滿外&#xff0c;其余每層節點數都達到最大值&#xff0c;并且最下…

【原創工具】同文件夾PDF文件合并 By憐渠客

【原創工具】同文件夾PDF文件合并 By憐渠客 原貼&#xff1a;可批量合并多個文件夾內的pdf工具 - 吾愛破解 - 52pojie.cn 他這個存在一些問題&#xff0c;并非是軟件內自主實現的PDF合并&#xff0c;而是調用的pdftk這一工具&#xff0c;但樓主并沒有提供pdftk&#xff0c;而…

微軟云和金山云和k8有什么區別

Kubernetes&#xff08;K8s&#xff09;和微軟云&#xff08;Microsoft Cloud&#xff09;是兩種不同的技術&#xff0c;分別用于不同的目的。Kubernetes是一個開源的容器編排系統&#xff0c;用于自動化部署、擴展和管理容器化應用程序&#xff0c;而微軟云是一個提供多種云服…

libGL.so.1: cannot open shared object file: No such file or directory-linux022

in <module> from PyQt5.QtGui import QPixmap, QFont, QIcon ImportError: libGL.so.1: cannot open shared object file: No such file or directory 這個錯誤信息表示XXXX 在啟動時遇到問題&#xff0c;缺少 libGL.so.1 文件。libGL.so.1 是與 OpenGL 圖形庫相關的共…

滲透測試【seacms V9】

搭建seacms環境 我選擇在虛擬機中用寶塔搭建環境 將在官網選擇的下載下來的文件解壓后拖入寶塔面板的文件中 創建網站 添加站點 搭建完成seacmsV9 找到一個報錯口 代碼分析 <?php set_time_limit(0); error_reporting(0); $verMsg V6.x UTF8; $s_lang utf-8; $dfDbn…

論文閱讀筆記:Continual Forgetting for Pre-trained Vision Models

論文閱讀筆記&#xff1a;Continual Forgetting for Pre-trained Vision Models 1 背景2 創新點3 方法4 模塊4.1 問題設置4.2 LoRA4.3 概述4.4 GS-LoRA4.5 損失函數 5 效果6 結論 1 背景 出于隱私和安全考慮&#xff0c;如今從預先訓練的視覺模型中刪除不需要的信息的需求越來…