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);
}
相关推荐
女程序猿!!!2 小时前
视频分辨率
windows
不讲废话的小白2 小时前
文件拖不进企微了怎么办
windows·企微
聪明努力的积极向上2 小时前
【.net framework】WINDOWS服务和控制台程序简单介绍
windows·.net
程序员霸哥哥6 小时前
snipaste免费版下载安装使用教程(附安装包)
windows·microsoft·snipaste
程序员霸哥哥7 小时前
Keil5下载教程及安装教程(附安装包)
windows·keil5·keil5下载教程·keil5安装教程
AI大模型学徒8 小时前
Chatbox 安装 for Windows
windows·语言模型·chatgpt
千里马学框架10 小时前
windows系统上aosp15上winscope离线html如何使用?
android·windows·html·framework·安卓窗口系统·winscope
2501_9389639610 小时前
Flutter 3.19 桌面应用开发:适配 Windows/macOS 端窗口大小与菜单栏自定义
windows·flutter·macos
G311354227310 小时前
云服务器系统 选择Windows和Linux的理由
linux·服务器·windows
龙须草AI笔记12 小时前
N8N系列:新手课程,本地 N8N 不安全?Windows 下 HTTPS 配置指南,新手也能看懂
windows·安全·https·入门教程·ai技术·ai工具·n8n