一、界面
1.1 界面绘制
一个tab、一个list
1.2 初始化
1.3 重绘
二、菜单
2.1 新建菜单
资源视图中新加入菜单
2.2 刷新与结束进程
添加事件处理程序
2.3 显示进程
双击添加事件后,加入下面程序
void CDlgTask::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: 在此添加控件通知处理程序代码
ShowList(m_tab.GetCurSel()); // 设置列表显示内容
*pResult = 0;
}
typedef BOOL(__stdcall* funIsHungAppWindow)(HWND hWnd);
void CDlgTask::ShowList(int num)
{
// 显示进程列表
if (num == 0) {
m_list.DeleteAllItems();
for (int i = 0; i < 4; i++) {
m_list.DeleteColumn(0); // 删除列
}
// 设置列
m_list.InsertColumn(0, "映像名称", LVCFMT_LEFT, 100, 0);
m_list.InsertColumn(1, "进程ID", LVCFMT_LEFT, 100, 1);
m_list.InsertColumn(2, "线程数量", LVCFMT_LEFT, 100, 2);
m_list.InsertColumn(3, "优先级别", LVCFMT_LEFT, 100, 3);
// 生成快照
HANDLE toolhelp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (toolhelp == NULL) {
return;
}
PROCESSENTRY32 processinfo;
int i = 0;
CString str;
BOOL start = Process32First(toolhelp, &processinfo); // 获得第一个进程
while (start) {
m_list.InsertItem(i, ""); // 插入行
m_list.SetItemText(i, 0, processinfo.szExeFile); // 获得映像名称
str.Format("%d", processinfo.th32ProcessID); // 获得进程ID
m_list.SetItemText(i, 1, str);
str.Format("%d", processinfo.cntThreads); // 获得线程数量
m_list.SetItemText(i, 2, str);
str.Format("%d", processinfo.pcPriClassBase); // 获得优先级别
m_list.SetItemText(i, 3, str);
start = Process32Next(toolhelp, &processinfo); // 获得下一个进程
i++;
}
}
// 显示窗口列表
else {
m_list.DeleteAllItems();
for (int i = 0; i < 6; i++) {
m_list.DeleteColumn(0); // 删除列
}
m_list.InsertColumn(0, "窗口", LVCFMT_LEFT, 200); // 设置列
m_list.InsertColumn(1, "状态", LVCFMT_LEFT, 100);
m_list.InsertColumn(2, "进程ID", LVCFMT_LEFT, 100);
HINSTANCE hInstance = LoadLibrary("user32.dll"); // 加载动态库
auto IsHungAppWindow = (funIsHungAppWindow)
GetProcAddress(hInstance, "IsHungAppWindow");
CWnd* pWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST); // 获得窗口句柄
int i = 0;
CString cstrCap;
// 遍历窗口
while (pWnd) { // 遍历窗口
// 窗口可见,并且是顶层窗口
if (pWnd->IsWindowVisible() && !pWnd->GetOwner()) {
pWnd->GetWindowText(cstrCap);
if (!cstrCap.IsEmpty()) {
m_list.InsertItem(i, cstrCap);
if (IsHungAppWindow(pWnd->m_hWnd)) { // 判断程序是否响应
m_list.SetItemText(i, 1, "不响应");
}
else {
m_list.SetItemText(i, 1, "正在运行");
}
//
DWORD dwProcessId;
GetWindowThreadProcessId(pWnd->GetSafeHwnd(), &dwProcessId);
CString str;
str.Format(_T("%d"), dwProcessId);
m_list.SetItemText(i, 2, str.GetString());
i++;
}
}
pWnd = pWnd->GetWindow(GW_HWNDNEXT); //搜索下一个窗口
}
}
}
2.4 菜单的重绘
三、最小化与关闭
类向导添加左键按下响应,加入以下代码
四、运行