Windows系统编程项目(四)窗口管理器

本章我们讲解基于对话框的MFC窗口相关的操作

该管理器要实现以下功能

初始化列表

初始化列表表头

初始化图像列表

初始化列表

功能实现

加载菜单

刷新列表

结束进程

隐藏窗口

最大化窗口

最小化窗口

手搓窗口管理器

// CWindowManage.cpp: 实现文件
//#include "pch.h"
#include "Manage.h"
#include "afxdialogex.h"
#include "CWindowManage.h"// CWindowManage 对话框IMPLEMENT_DYNAMIC(CWindowManage, CDialogEx)CWindowManage::CWindowManage(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_WindowManage, pParent)
{}CWindowManage::~CWindowManage()
{
}void CWindowManage::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_CWindowList, m_WindowList);
}BEGIN_MESSAGE_MAP(CWindowManage, CDialogEx)ON_NOTIFY(NM_RCLICK, IDC_CWindowList, &CWindowManage::OnOpenMenu)ON_COMMAND(ID_32782, &CWindowManage::OnWindowList)ON_COMMAND(ID_32783, &CWindowManage::OnKillProcess)ON_COMMAND(ID_32785, &CWindowManage::OnMaxWindow)ON_COMMAND(ID_32786, &CWindowManage::OnMinWindow)ON_COMMAND(ID_32784, &CWindowManage::OnShowWindow)
END_MESSAGE_MAP()// CWindowManage 消息处理程序BOOL CWindowManage::OnInitDialog()
{CDialogEx::OnInitDialog();// TODO:  在此添加额外的初始化m_WindowList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);m_WindowList.InsertColumn(0, L"窗口名", LVCFMT_LEFT, 150);m_WindowList.InsertColumn(1, L"运行状态", LVCFMT_LEFT, 100);m_WindowList.InsertColumn(2, L"进程ID", LVCFMT_LEFT, 100);m_WindowList.InsertColumn(3, L"窗口句柄", LVCFMT_LEFT, 100);m_WindowList.InsertColumn(4, L"路径", LVCFMT_LEFT, 300);m_ImageList.Create(15, 15, ILC_COLOR32 | ILC_MASK, 0, 1);m_WindowList.SetImageList(&m_ImageList, LVSIL_SMALL);InitWindowList();return TRUE;  // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE
}void CWindowManage::InitWindowList()
{CWnd* pWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);ULONG Index = 0;while (pWnd){CString WindowText;TCHAR szProcessID[MAX_PATH] = { 0 };TCHAR szWindowHandle[MAX_PATH] = { 0 };TCHAR szWindowPath[MAX_PATH] = { 0 };if (pWnd->IsWindowVisible() && !pWnd->GetOwner()){pWnd->GetWindowText(WindowText);WindowText.TrimLeft();WindowText.TrimRight();}if (!WindowText.IsEmpty()){m_WindowList.InsertItem(Index, WindowText, Index);if (IsHungAppWindow(pWnd->m_hWnd)){m_WindowList.SetItemText(Index, 1, L"未响应");}else{m_WindowList.SetItemText(Index, 1, L"正在运行");}DWORD dwProcessID;GetWindowThreadProcessId(pWnd->m_hWnd, &dwProcessID);wsprintf(szProcessID, L"%d", dwProcessID);m_WindowList.SetItemText(Index, 2, szProcessID);wsprintf(szWindowHandle, L"%d", pWnd->m_hWnd);m_WindowList.SetItemText(Index, 3, szWindowHandle);HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, dwProcessID);GetModuleFileNameEx(hProcess, NULL, szWindowPath , MAX_PATH);m_WindowList.SetItemText(Index, 4, szWindowPath);InsertImage(szWindowPath);Index++;}pWnd = pWnd->GetNextWindow(GW_HWNDNEXT);}
}void CWindowManage::InsertImage(CString lpNamePath)
{HICON hIcon = NULL;hIcon = ::ExtractIcon(NULL, lpNamePath, 0);if (hIcon == NULL){m_ImageList.Add( LoadIcon(NULL, IDI_APPLICATION));}else{m_ImageList.Add(hIcon);}
}void CWindowManage::OnOpenMenu(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知处理程序代码POINT pt = { 0 };GetCursorPos(&pt);HMENU hMenu = LoadMenu(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_MENU4));hMenu = GetSubMenu(hMenu, 0);TrackPopupMenu(hMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, m_hWnd, NULL);*pResult = 0;
}void CWindowManage::OnWindowList()
{// TODO: 在此添加命令处理程序代码m_WindowList.DeleteAllItems();while (m_ImageList.Remove(0));InitWindowList();
}void CWindowManage::OnKillProcess()
{// TODO: 在此添加命令处理程序代码DWORD dwPos = (DWORD)m_WindowList.GetFirstSelectedItemPosition();dwPos--;CString csProcessID =  m_WindowList.GetItemText(dwPos, 2);DWORD dwProcessID = _ttoi(csProcessID);HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);TerminateProcess(hProcess, 0);CloseHandle(hProcess);
}void CWindowManage::OnMaxWindow()
{// TODO: 在此添加命令处理程序代码DWORD dwPos = (DWORD)m_WindowList.GetFirstSelectedItemPosition();dwPos--;CString cshWnd = m_WindowList.GetItemText(dwPos, 3);DWORD dwhWnd = _ttoi(cshWnd);ShowWindowAsync((HWND)dwhWnd, SW_MAXIMIZE);
}void CWindowManage::OnMinWindow()
{// TODO: 在此添加命令处理程序代码DWORD dwPos = (DWORD)m_WindowList.GetFirstSelectedItemPosition();dwPos--;CString cshWnd = m_WindowList.GetItemText(dwPos, 3);DWORD dwhWnd = _ttoi(cshWnd);ShowWindowAsync((HWND)dwhWnd, SW_MINIMIZE);
}void CWindowManage::OnShowWindow()
{// TODO: 在此添加命令处理程序代码DWORD dwPos = (DWORD)m_WindowList.GetFirstSelectedItemPosition();dwPos--;CString cshWnd = m_WindowList.GetItemText(dwPos, 3);DWORD dwhWnd = _ttoi(cshWnd);ShowWindowAsync((HWND)dwhWnd, SW_RESTORE);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化 NFS 挂载参数以提升可靠性与容错性

在现代 IT 基础设施中&#xff0c;NFS&#xff08;网络文件系统&#xff09;被广泛用于共享文件和存储。虽然 NFS 提供了便利&#xff0c;但在某些情况下&#xff0c;挂载失败或网络问题可能导致挂载操作不稳定。为了提高挂载的可靠性和容错性&#xff0c;我们可以通过优化 NFS…

JavaScript事件循环机制

JavaScript 事件循环机制&#xff08;Event Loop&#xff09;详解 JavaScript 是 单线程、非阻塞 语言&#xff0c;依赖 事件循环&#xff08;Event Loop&#xff09; 来实现异步编程。它的执行模型包括 调用栈&#xff08;Call Stack&#xff09;、任务队列&#xff08;Task …

大模型架构记录4-文档切分 (chunks构建)

chunks&#xff1a; 块 trunks : 树干 “RAG”通常指 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff09; 主要框架&#xff1a;用户提query&#xff0c;找到和它相关的&#xff0c;先把问题转换为向量&#xff0c;和向量数据库的数据做比较&#xff0c;检…

物联网IoT系列之MQTT协议基础知识

文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么&#xff1f;什么是MQTT&#xff1f;为什么说MQTT是适用于物联网的协议&#xff1f;MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …

第27周JavaSpringboot电商进阶开发 1.企业级用户验证

课程笔记&#xff1a;注册邮箱验证 一、概述 从本小节开始&#xff0c;将学习如何进行注册邮箱验证。主要任务是给项目配置一个公共邮箱&#xff08;可自己注册或由公司提供&#xff09;&#xff0c;用于向用户发送验证码&#xff0c;帮助用户完成注册流程。课程中以QQ邮箱为…

数据库---sqlite3

数据库&#xff1a; 数据库文件与普通文件区别: 1.普通文件对数据管理(增删改查)效率低 2.数据库对数据管理效率高,使用方便 常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:Oracle、DB2 中型:MySql、SQLServer …

音视频软件工程师面试题

一、基础知识 编解码相关 H.264 和 H.265(HEVC)的主要区别是什么?视频编解码的基本流程是什么?关键技术有哪些?音频编解码(如 AAC、MP3、Opus)的区别和应用场景?什么是 B 帧、P 帧、I 帧?它们的作用是什么? 流媒体协议RTMP、HTTP-FLV、HLS、WebRTC 的区别和应用场景…

【系统架构设计师】测试方法

目录 1. 说明2. 静态测试3. 动态测试4. 黑盒测试5. 白盒测试6. 灰盒测试7. 自动化测试8.例题8.1 例题1 1. 说明 1.软件测试方法的分类有很多种&#xff0c;以测试过程中程序执行状态为依据可分为静态测试&#xff08;Static Testing&#xff0c;ST&#xff09;和动态测试&…

tomcat配置应用----server.xml文件具体配置

1.tomcat项目目录 默认项目目录&#xff1a;tomcat安装目录/webapps目录 如上图所示&#xff0c;在tomcat的项目目录下有很多子文件夹&#xff0c;这些子文件夹中都有一个项目首页。 如上图所示&#xff0c;将来我们去使用IP加端口号的方式去访问tomcat的时候&#xff0c;默认是…

Spring Boot 调用DeepSeek API的详细教程

目录 前置准备步骤1&#xff1a;创建Spring Boot项目步骤2&#xff1a;配置API参数步骤3&#xff1a;创建请求/响应DTO步骤4&#xff1a;实现API客户端步骤5&#xff1a;创建控制器步骤6&#xff1a;异常处理步骤7&#xff1a;测试验证单元测试示例Postman测试请求 常见问题排查…

多维数据聚合方案:SQL GROUPING SETS深度解析

一、什么是GROUPING SETS&#xff1f; GROUPING SETS是SQL标准中的多维聚合运算符&#xff0c;允许在单个查询中实现多维度组合的分组统计。相较于传统UNION ALL方案&#xff0c;性能可提升3-10倍&#xff08;TPC-DS基准测试&#xff09;。 二、核心语法解析 SELECT column1,…

Excel中国式排名,3种方法!

大家好&#xff0c;我是小鱼。 什么是中国式排名呢&#xff1f; 举个例子比如说公司一共有10名员工进行成绩考核&#xff0c;如果9个人考核成绩都是90分&#xff0c;你是89分&#xff0c;按照国际惯用的排名法则&#xff1a;9 个人考核成绩并列第一&#xff0c;你第10名&…

哪些业务场景更适合用MongoDB?何时比MySQL/PostgreSQL好用?

哪些业务场景更适合用MongoDB&#xff1f;何时比MySQL/PostgreSQL好用&#xff1f; 就像淘宝的个性化推荐需要灵活调整商品标签&#xff0c;MongoDB这种"变形金刚"式的数据库&#xff0c;在处理以下三类中国特色业务场景时更具优势&#xff1a; 一、动态数据就像&q…

深度解读:OpenAI发布GPT-5的技术突破与商业影响

引言 2025年2月&#xff0c;OpenAI正式发布GPT-5&#xff0c;这一被誉为“AI新纪元开篇之作”的模型&#xff0c;不仅实现了技术架构的颠覆性创新&#xff0c;更以免费开放策略引发行业地震。本文将从技术突破、商业影响、行业竞争格局及未来挑战四个维度&#xff0c;全面解析…

网络防火墙是什么有什么用_网络防火墙:守护信息安全的重要屏障

网络防火墙的基本概念 网络防火墙是网络安全领域的重要组成部分&#xff0c;它充当着内部网络和外部网络之间的安全防护层。防火墙能够监控和控制进出网络的数据流&#xff0c;只允许符合安全策略的信息通过&#xff0c;从而有效阻止潜在威胁的入侵。简而言之&#xff0c;网络…

C# WPF 串口通信

C# WPF 串口通信 安装依赖库 安装依赖库 System.IO.Ports using System.Diagnostics; using System.IO.Ports; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windo…

【玩转23种Java设计模式】结构型模式篇:组合模式

软件设计模式&#xff08;Design pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…

如何选取合适的 NewRatio 值来优化 JVM 的垃圾回收策略

目录 一、垃圾回收模型简介 &#xff08;一&#xff09;新生代&#xff08;Young Generation&#xff09; &#xff08;二&#xff09;老年代&#xff08;Old Generation&#xff09; &#xff08;三&#xff09;NewRatio 的作用与影响 &#xff08;四&#xff09;图解&am…

Element Plus中的树组件的具体用法(持续更新!)

const defaultProps {//子树为节点对象的childrenchildren: children,//节点标签为节点对象的name属性label: name, } 属性 以下是树组件中的常用属性以及作用&#xff1a; data&#xff1a;展示的数据&#xff08;数据源&#xff09; show-checkbox&#xff1a;节点是否可…