MFC 任务管理器设计
在学习界面设计,因为对一些控件不熟悉,所以也参考了别人的。核心代码如下。



void CTasklistDlg::Expand()
{
m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
m_list.InsertColumn(,L"Process Name",,);
m_list.InsertColumn(,L"Pid",,);
m_list.InsertColumn(,L"Path",,);
} void CTasklistDlg::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: Add your control notification handler code here
CMenu popup;
popup.LoadMenu(IDR_MENU1);
CMenu* pM = popup.GetSubMenu();
CPoint p;
GetCursorPos(&p);
int count = pM->GetMenuItemCount();
if (m_list.GetSelectedCount() == ) //如果没有选中
{
for (int i = ; i < count; i++)
{
pM->EnableMenuItem(i, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); //菜单全部变灰
} }
pM->TrackPopupMenu(TPM_LEFTALIGN, p.x, p.y, this); *pResult = ;
} #include<Tlhelp32.h>
#include<Psapi.h>
#pragma comment(lib,"Psapi.lib") BOOL CTasklistDlg::GetProcessList()
{
BOOL result = FALSE;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );
if (hSnap == INVALID_HANDLE_VALUE)
return FALSE; int idx = ;
CString strID;
HANDLE hProcess = NULL;
CString strPath, strSys(_T("SystemRoot")); PROCESSENTRY32 info = { };
info.dwSize = sizeof(PROCESSENTRY32); BOOL bRet = Process32First(hSnap,&info); while (bRet)
{
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, info.th32ProcessID);
if (hProcess)
{
strPath.Empty();
DWORD dwRet = GetModuleFileNameEx(hProcess, NULL, strPath.GetBufferSetLength(MAX_PATH), MAX_PATH);
strPath.ReleaseBuffer();
strPath.TrimLeft(_T("\\?"));
if (strPath.Left(strSys.GetLength()).CompareNoCase(strSys) == )
{
TCHAR szWin[MAX_PATH] = { };
GetWindowsDirectory(szWin,MAX_PATH);
strPath.Replace(strSys,szWin); }
SHFILEINFO shInfo = { };
SHGetFileInfo(strPath, , &shInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON);
} idx = m_list.InsertItem(m_list.GetItemCount(), info.szExeFile);
strID.Empty();
strID.Format(_T("%d"), info.th32ProcessID);
m_list.SetItemText(idx, , strID);
m_list.SetItemText(idx, , strPath); bRet = Process32Next(hSnap, &info);
} return TRUE;
} BOOL CTasklistDlg::AdjustPrivileges()
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tp = { };
TOKEN_PRIVILEGES oldtp = { };
DWORD dwSize = sizeof(TOKEN_PRIVILEGES);
LUID luid = { }; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
return TRUE;
else
return FALSE;
}
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {
CloseHandle(hToken);
return FALSE;
} tp.PrivilegeCount = ;
tp.Privileges[].Luid = luid;
tp.Privileges[].Attributes = SE_PRIVILEGE_ENABLED; /* Adjust Token Privileges */
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {
CloseHandle(hToken);
return FALSE;
} // close handles
CloseHandle(hToken);
return TRUE;
}
void CTasklistDlg::OnKillprocess()
{
// TODO: Add your command handler code here
//DWORD ProcessID = 0;
DWORD dwProcess;
wchar_t szBuf[MAX_PATH] = {};
int index = m_list.GetSelectionMark(); //获取光标所在的位置
m_list.GetItemText(index, , szBuf, MAX_PATH); //获取多少行光标,然后取得数据
dwProcess = _wtol(szBuf);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcess);
if (NULL == hProcess)
{
MessageBox(L"打开那进程句柄失败!");
} if (TerminateProcess(hProcess, ))
{
PROCESSITEM* pProcItem;
pProcItem = (PROCESSITEM*)m_list.GetItemData(index);
delete pProcItem;
m_list.DeleteItem(index);
MessageBox(L"进程结束成功");
}
else
{
MessageBox(L"结束进程失败!");
}
} void CTasklistDlg::OnInfoExit()
{
exit();
// TODO: Add your command handler code here
} void CTasklistDlg::OnInfoRefresh()
{
// TODO: Add your command handler code here
m_list.SetRedraw(FALSE);
m_list.DeleteAllItems();
GetProcessList();
m_list.SetRedraw(TRUE);
m_list.Invalidate();
m_list.UpdateWindow();
}
MFC 任务管理器设计的更多相关文章
- MFC任务管理器task manager----进程的挂起与恢复--NtSuspendProcess&&NtResumeProcess
http://hi.baidu.com/xbbsh/blog/item/b73d3125462201084c088db1.html ---------------------------------- ...
- 【MFC】MFC DLEdit 设计属于自己的编辑框_鼠标悬停
MFC DLEdit 设计属于自己的编辑框 2012-02-04 13:00 by 捣乱小子, 3543 阅读, 5 评论, 收藏, 编辑 起因 无意间看到了大牛们写的自定义编辑框控件,于是找了个时间 ...
- MFC工具栏设计
工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标来表示.当单击某个按钮时,会产生一个相应的消息,对这个消息的处理就是按钮的功能实现.将菜单中常用的功能放置在工具栏中,这样可以方便用户操作,省 ...
- OpenCV与MFC实战之图像处理 样本采集小工具制作 c++MFC课程设计
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12111102.html 入门不久的人可以通过opencv实战来锻炼一下学习opencv的成果, ...
- MFC-01-Chapter01:Hello,MFC---1.2 MFC简介
1.2 MFC简介 MFC是Microsoft提供的放置Windows API的面向对象的包装的C++类库.MFC大约封装了好几百个类,其中有一些可以直接调用,有些类可以作为用户自己的类的基类.一些M ...
- C++新手之详细介绍MFC
MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对 ...
- C++的MFC,与C#的.NET
转载:http://blog.sina.com.cn/s/blog_7f5bde5c0101hk5n.html 以下摘自各问答网站.博客论坛: [1]MFC早已过时,现在C++多数是用来编写底层方法而 ...
- 评侯捷的<深入浅出MFC>和李久进的<MFC深入浅出>
侯捷的<深入浅出mfc>相信大家都已经很熟悉了,论坛上也有很多介绍,这里我就不多说了. 而李久进的<mfc深入浅出>,听说的人可能就少得多.原因听说是这本书当时没有怎么宣传,而 ...
- 基于VC++的网络扫描器设计与实现
本文正文其实是自己的毕业论文,现在搬上来有两个原因. 一是之前大学的文档都放在百度网盘上,大概去年的时候百度网盘改版搞得不太稳定,文件夹移动次数一多里边就会有一些文件丢失了,也没有很在意.但前几天看申 ...
随机推荐
- 【BZOJ3996】[TJOI2015]线性代数 最大权闭合图
[BZOJ3996][TJOI2015]线性代数 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的 ...
- docker运行oracle11g
image docker pull registry.cn-hangzhou.aliyuncs.com/qida/oracle-xe-11g 或者自己自动添加表 create role test_ro ...
- vitess数据中心迁移步骤
在使用vitess的时候我们会遇到刚开始所有的元数据都在同一个ETCD集群中,后续随着业务的增长需要进行数据中心拆分: 分别拆分成多个Local集群的数据中心: 以下就简单说明下迁移步骤: 迁移拓扑图 ...
- 修改docker时区
在实际业务场景中,经常碰到启动了一个容器,容器的时区是UTC的导致还需要重新运行: 我们在具体处理时也出现了该显现 业务场景: 数据库系统定时备份脚本, 定时备份脚本按照每天备份, 通过k8s启动容器 ...
- FineReport----单元格元素(数据列、公式、斜线)
一.绑定.插入数据列 数据集字段绑定 二.公式 1.单元 格计算 1.两个单元格(C7,I7)和 2.等于某单元格的值 D7等C7单元格的值 3.C7/8(除) 4.除数被除数为零.空的处理 http ...
- 墨菲定律(Murphy's Law)
https://baike.baidu.com/item/墨菲定律/746284?fr=aladdin 墨菲定律是一种心理学效应,是由 爱德华·墨菲(Edward A. Murphy)提出的. 主要内 ...
- 七牛云 如何配置域名的 CNAME
CNAME 简介 CNAME 即指别名记录,也被称为规范名字.这种记录允你将多个名字映射到同一台计算机. 当需要将域名指向另一个域名,再由另一个域名提供 ip地址,就需要添加 CNAME 记录. 为什 ...
- Spring Security教程 ---- 验证码功能的实现
有三中方法可以实现验证码的功能 第一种是自定义一个filter,放在SpringSecurity过滤器之前,在用户登录的时候会先经过这个filter,然后在这个filter中实现对验证码进行验证的功能 ...
- java 多线程 day05 线程范围内的数据共享
import java.util.HashMap;import java.util.Map;import java.util.Random;/** * Created by chengtao on 1 ...
- Spring 数据库连接池读取系统环境变量作为参数
原来是写在一个properties文件里面,后来项目要部署的的确太多了,每次更改不太方便,就想把这些固定不变的信息写在当地的环境变量里面 原先是这样的:引用的所有信息在jdbc.properties ...