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

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

该管理器要实现以下功能

初始化列表

初始化列表表头

初始化图像列表

初始化列表

功能实现

加载菜单

刷新列表

结束进程

隐藏窗口

最大化窗口

最小化窗口

手搓窗口管理器

cpp 复制代码
// 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);
}
相关推荐
万联WANFLOW13 分钟前
CVE-2026-98432 等漏洞自查:AI 查出的 Linux、Windows 漏洞,运维怎么确认受不受影响
linux·运维·windows·网络安全
AlanAshley1 小时前
Windows 中导致延迟的软硬件及协议比重
windows
yuezhilangniao2 小时前
win10中文 以及 PowerShell 开发日常
windows·powershell
共享家952718 小时前
408 操作系统第一章
服务器·数据库·windows
Sakura_j_h_20 小时前
GitHub Actions 打包 Windows exe:中文编码与产物上传
windows·ci/cd·打包发布·github·pyinstaller·github actions
xixiaoyunya1 天前
搭一个浏览器即用的二进制文件分发点:目录规范与权限边界实践
网络·windows
麻瓜code1 天前
Spring AI 全模块 API 字典一览(1.1.0 版)
人工智能·windows·spring
zrc0070071 天前
steam无法登录 steam错误 登录时出现错误。请稍后再试。解决办法 steam无法登录解决办法 湖南地区steam DNS问题解决办法
windows·经验分享·游戏·缓存·游戏程序·创业创新·玩游戏
BK贝壳1 天前
布尔队列 BHA_Queue:入队出队均摊 O(1);附 BHA_Dict
windows
-星空下无敌1 天前
Windows Docker K8s 安装部署Naocs ,SpringBoot 3.x 4.x 整合Naocs 版本兼容 配置中心、服务注册与发现
windows·docker·nacos·kubernetes·springboot·alibaba