C++写一个内存清理软件(五、进程管理)

37 篇文章 3 订阅
32 篇文章 0 订阅

一、界面

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 菜单的重绘

在这里插入图片描述

三、最小化与关闭

类向导添加左键按下响应,加入以下代码
在这里插入图片描述

在这里插入图片描述

四、运行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值