📄 listview.cpp
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#include "Main.h"
#include "ListView.h"
#include <TLHelp32.h>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CListView 类静态变量
HWND CListView::m_hWnd = NULL;
UINT CListView::m_uView = IDM_View_Task;
UINT CListView::m_uCount = 0;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 创建
VOID CListView::Create()
{
RECT rtRect;
GetClientRect(CMainWnd::m_hWnd, &rtRect);
m_hWnd = CreateWindow(WC_LISTVIEW, NULL,
WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SINGLESEL,
0, 0, _RectWidth(rtRect), _RectHeight(rtRect), CMainWnd::m_hWnd, NULL, g_hInst, NULL);
LVCOLUMN lvcColumn;
lvcColumn.mask = LVCF_WIDTH;
lvcColumn.cx = _RectWidth(rtRect);
ListView_InsertColumn(m_hWnd, 0, &lvcColumn);
ListView_SetExtendedListViewStyle(m_hWnd, LVS_EX_FULLROWSELECT | LVS_EX_GRADIENT | LVS_EX_NOHSCROLL);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 刷新
VOID CListView::Refresh(UINT uView)
{
m_uView = uView;
CMainWnd::CheckMenuRadio(IDM_View_Task, IDM_View_Storage, m_uView);
m_uCount = 0;
ListView_DeleteAllItems(m_hWnd);
if (m_uView == IDM_View_Task)
{
EnumWindows(EnumWindowsProc, FALSE);
}
else
{
EnumProcess();
}
// 设置软键按钮
TBBUTTONINFO biButton = {0};
biButton.cbSize = sizeof(TBBUTTONINFO);
biButton.dwMask = TBIF_STATE;
biButton.fsState = m_uCount ? TBSTATE_ENABLED : TBSTATE_INDETERMINATE;
SendMessage(CMainWnd::m_hMenuBar, TB_SETBUTTONINFO, IDM_Close,(LPARAM) &biButton);
// 设置菜单项
CMainWnd::EnableMenu(IDM_CloseOthers, m_uCount >= 2);
CMainWnd::EnableMenu(IDM_CloseAll, m_uCount);
CMainWnd::EnableMenu(IDM_Goto, m_uCount);
CMainWnd::EnableMenu(IDM_Properties, m_uCount);
ListView_SetItemState(m_hWnd, 0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 转到
VOID CListView::Goto(UINT uIndex)
{
if (uIndex < m_uCount)
{
if (m_uView == IDM_View_Task)
{
SetForegroundWindow((HWND) GetParam(uIndex));
}
else
{
View(uIndex);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 属性
VOID CListView::View(UINT uIndex)
{
if (uIndex < m_uCount)
{
TCHAR tzText[1024];
TCHAR tzPath[MAX_PATH];
LPARAM lParam = GetParam(uIndex);
if (m_uView == IDM_View_Task)
{
DWORD dwProcess;
TCHAR tzClass[MAX_PATH];
TCHAR tzCaption[MAX_PATH];
HWND hWnd = (HWND) lParam;
tzPath[0] = 0;
GetClassName(hWnd, tzClass, MAX_PATH);
GetWindowText(hWnd, tzCaption, MAX_PATH);
GetWindowThreadProcessId(hWnd, &dwProcess);
EnumProcess(dwProcess, tzPath);
wsprintf(tzText, STR_TaskMsg,
tzCaption,
hWnd,
GetWindowLong(hWnd, GWL_STYLE),
GetWindowLong(hWnd, GWL_EXSTYLE),
tzClass,
GetClassLong(hWnd, GCL_STYLE),
dwProcess,
tzPath);
}
else
{
ListView_GetItemText(m_hWnd, uIndex, 0, tzPath, MAX_PATH);
wsprintf(tzText, STR_ProcessMsg, (DWORD) lParam, (uIndex <= 9) ? (tzPath + 3) : tzPath);
}
CMainWnd::MsgBox(tzText, IDM_Properties);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 关闭
VOID CListView::Close()
{
UINT uCur = ListView_GetNextItem(m_hWnd, -1, LVIS_SELECTED);
if (uCur != LB_ERR)
{
if (m_uView == IDM_View_Task)
{
CloseTask(uCur);
}
else
{
CloseProcess(uCur);
}
Refresh();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 关闭全部
VOID CListView::CloseAll(BOOL bExcludeCur)
{
UINT uCur = bExcludeCur ? ListView_GetNextItem(m_hWnd, -1, LVIS_SELECTED) : -1;
for (UINT i = 0; i < m_uCount; i++)
{
if (i != uCur)
{
if (m_uView == IDM_View_Task)
{
CloseTask(i);
}
else
{
CloseProcess(i);
}
}
}
Refresh();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 枚举窗口
BOOL CALLBACK CListView::EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
if ((hWnd != CMainWnd::m_hWnd) && IsActiveWindow(hWnd))
{
TCHAR tzText[MAX_PATH];
hWnd = GetOwnerWindow(hWnd);
GetClassName(hWnd, tzText, MAX_PATH);
if (CMainWnd::IsMenuChecked(IDM_Help_ShowSysApp) || IsUserTask(tzText))
{
if (GetWindowText(hWnd, tzText, MAX_PATH))
{
if (lParam)
{
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
else
{
AddItem(tzText, (LPARAM) hWnd);
}
}
}
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 关闭任务
VOID CListView::CloseTask(UINT uIndex)
{
HWND hWnd = (HWND) (HWND) GetParam(uIndex);
if (IsWindow(hWnd))
{
SendMessage(hWnd, WM_CLOSE, 0, 0);
if (IsWindow(hWnd))
{
DWORD dwProcess;
GetWindowThreadProcessId(hWnd, &dwProcess);
CloseProcess(dwProcess);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 枚举进程
VOID CListView::EnumProcess(DWORD dwProcess, PTSTR ptzPath)
{
// 枚举进程
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 peProcess = {sizeof(PROCESSENTRY32)};
for (BOOL bResult = Process32First(hSnap, &peProcess); bResult; bResult = Process32Next(hSnap, &peProcess))
{
if (ptzPath)
{
if (dwProcess == peProcess.th32ProcessID)
{
lstrcpy(ptzPath, peProcess.szExeFile);
break;
}
}
else if (CMainWnd::IsMenuChecked(IDM_Help_ShowSysApp) || IsUserProcess(peProcess.szExeFile))
{
AddItem(peProcess.szExeFile, (LPARAM) peProcess.th32ProcessID);
}
}
// 关闭快照句柄
CloseToolhelp32Snapshot(hSnap);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 关闭进程
VOID CListView::CloseProcess(UINT uIndex)
{
HANDLE hProcess = OpenProcess(0, FALSE, (DWORD) GetParam(uIndex));
if (hProcess)
{
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 添加列表项
INT CListView::AddItem(PTSTR ptzText, LPARAM lParam)
{
LVITEM lviItem = {0};
// 添加快捷索引号
if (m_uCount <= 9)
{
TCHAR tzText[MAX_PATH];
wsprintf(tzText, TEXT("%u. %s"), m_uCount, ptzText);
lviItem.pszText = tzText;
}
else
{
lviItem.pszText = ptzText;
}
// 添加项目
lviItem.iItem = m_uCount++;
lviItem.mask = LVIF_TEXT | LVIF_PARAM;
lviItem.lParam = lParam;
return ListView_InsertItem(m_hWnd, &lviItem);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -