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);
}