因为任务管理器中涉及到进程的枚举操作,所以把两节课的知识点合并到一起来讲!
①、设计界面、以及列表控件变量的绑定;
②、列表控件样式的指定:
m_TaskList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
m_TaskList.InsertColumn(0, _T(" 进程名称"), 0, 100);
m_TaskList.InsertColumn(1, _T(" PID"), 0, 60);
m_TaskList.InsertColumn(2, _T(" 文件路径"), 0, 380);
③、进程列表的获取:
具体的方法也是多种的,具体见:http://www.cctry.com/thread-11857-1-1.html
这里面我们使用第一种方法给大家讲解:
#include <Tlhelp32.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")
BOOL CMFCTestDlg::GetProcessList()
{
BOOL bResult = FALSE;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ( hSnap == INVALID_HANDLE_VALUE )
return FALSE;
int idx = 0;
CString strID;
HANDLE hProcess = NULL;
PROCESSENTRY32 info = {0};
info.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet = Process32First(hSnap, &info);
while(bRet) {
idx = m_TaskList.InsertItem(m_TaskList.GetItemCount(), _T(""));
m_TaskList.SetItemText(idx, 0, info.szExeFile);
strID.Empty();
strID.Format(_T("%d"), info.th32ProcessID);
m_TaskList.SetItemText(idx, 1, strID);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, info.th32ProcessID);
if (hProcess) {
TCHAR szPath[MAX_PATH] = {0};
GetModuleFileNameEx(hProcess, NULL, szPath, MAX_PATH);
m_TaskList.SetItemText(idx, 2, szPath);
}
bRet = Process32Next(hSnap, &info);
}
return TRUE;
}
④、Debug 权限提升函数:
BOOL AdjustPrivileges()
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tp = {0};
TOKEN_PRIVILEGES oldtp = {0};
DWORD dwSize = sizeof(TOKEN_PRIVILEGES);
LUID luid = {0};
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=1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].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;
}
⑤、菜单资源的添加及编辑:
刷新列表:ID_M_REFRESH_LIST
结束此进程:ID_M_EDN_TASK
定位文件:ID_M_FIND_EXE
拷贝路径:ID_M_COPY_PATH
⑥、菜单资源的弹出:
void CMFCTestDlg::OnNMRClickTaskList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
if ( pNMItemActivate->iItem < 0 ) return;
CString strID = m_TaskList.GetItemText(pNMItemActivate->iItem, 1);
CPoint pt;
GetCursorPos(&pt);
CMenu mMenu, *pMenu;
mMenu.LoadMenu(IDR_MENU);
pMenu = mMenu.GetSubMenu(0);
if (strID == _T("0") || strID == _T("4")){
pMenu->EnableMenuItem(ID_M_EDN_TASK, MF_BYCOMMAND|MF_GRAYED);
pMenu->EnableMenuItem(ID_M_FIND_EXE, MF_BYCOMMAND|MF_GRAYED);
pMenu->EnableMenuItem(ID_M_COPY_PATH, MF_BYCOMMAND|MF_GRAYED);
}
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);
*pResult = 0;
}
⑦、菜单响应函数的实现:
void CMFCTestDlg::OnMRefreshList()
{
for (int idx = 0; idx < m_ImgList.GetImageCount(); idx++) {
m_ImgList.Remove(idx);
}
m_TaskList.DeleteAllItems();
GetProcessList();
}
void CMFCTestDlg::OnMEdnTask()
{
int idx = m_TaskList.GetSelectionMark();
CString strID = m_TaskList.GetItemText(idx, 1);
CString strName = m_TaskList.GetItemText(idx, 0);
int iRet = MessageBox(_T("您确定要结束 ")+strName+_T(" 吗?"), _T("友情提示"), MB_OKCANCEL);
if (iRet == IDCANCEL) return;
if ( strID == _T("0") || strName == _T("4")) { //实际上这个位置的判断是多余的
MessageBox(_T("系统进程,无法结束!"), _T("提示"));
}else{
BOOL bRet = FALSE;
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE|PROCESS_QUERY_INFORMATION, FALSE, _tstoi(strID));
if ( hProcess != NULL ) {
bRet = TerminateProcess(hProcess, -1);
CloseHandle(hProcess);
}
if ( !bRet ) {
MessageBox(_T("结束进程 \" ") + strName + _T(" \" 失败,请重试!"), _T("提示"));
}else{
m_TaskList.DeleteItem(idx);
}
}
}
void CMFCTestDlg::OnMFindExe()
{
int idx = m_TaskList.GetSelectionMark();
CString strPath = m_TaskList.GetItemText(idx, 2);
if (strPath.GetLength() > 0)
ShellExecute(m_hWnd, _T("open"), _T("Explorer.exe"), _T("/select,")+strPath, NULL, SW_SHOW);
}
void CMFCTestDlg::OnMCopyPath()
{
int idx = m_TaskList.GetSelectionMark();
CString strPath = m_TaskList.GetItemText(idx, 2);
if (!OpenClipboard()) return;
if(!EmptyClipboard()) {
CloseClipboard();
return;
}
size_t cbStr = (strPath.GetLength()+1)*sizeof(TCHAR);
HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE, cbStr);
memcpy_s(GlobalLock(hData), cbStr, strPath.LockBuffer(), cbStr);
GlobalUnlock(hData);
strPath.UnlockBuffer();
UINT uiFormat = (sizeof(TCHAR) == sizeof(WCHAR)) ? CF_UNICODETEXT : CF_TEXT;
if (::SetClipboardData(uiFormat, hData) == NULL) {
MessageBox(_T("设置剪贴板数据失败!"));
CloseClipboard();
return;
}
CloseClipboard();
}
⑧、为列表控件加上程序的前缀图标:
// H 头文件中进行图像列表的定义:
CImageList m_ImgList;
// OnInitDialog() 函数中进行图像列表的创建及设置:
m_ImgList.Create(16, 16, ILC_COLOR24, 10, 10);
m_TaskList.SetImageList(&m_ImgList, LVSIL_SMALL);
⑨、修改GetProcessList()函数为如下:
BOOL CMFCTestDlg::GetProcessList()
{
BOOL bResult = FALSE;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ( hSnap == INVALID_HANDLE_VALUE )
return FALSE;
int idx = 0, imgIdx = -1;
CString strID;
HANDLE hProcess = NULL;
CString strPath, strSys(_T("SystemRoot"));
PROCESSENTRY32 info = {0};
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();
GetModuleFileNameEx(hProcess, NULL, strPath.GetBufferSetLength(MAX_PATH), MAX_PATH);
strPath.ReleaseBuffer();
strPath.TrimLeft(_T("\\?"));
if (strPath.Left(strSys.GetLength()).CompareNoCase(strSys) == 0){
TCHAR szWin[MAX_PATH] = {0};
GetWindowsDirectory(szWin, MAX_PATH);
strPath.Replace(strSys, szWin);
}
SHFILEINFO shInfo = {0};
SHGetFileInfo(strPath, 0, &shInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON|SHGFI_ICON);
imgIdx = m_ImgList.Add(shInfo.hIcon);
}
//进行列表项的插入
idx = m_TaskList.InsertItem(m_TaskList.GetItemCount(), _T(""), imgIdx);
m_TaskList.SetItemText(idx, 0, info.szExeFile);
strID.Empty();
strID.Format(_T("%d"), info.th32ProcessID);
m_TaskList.SetItemText(idx, 1, strID);
m_TaskList.SetItemText(idx, 2, strPath);
//继续遍历进程列表
bRet = Process32Next(hSnap, &info);
}
return TRUE;
}
1、使用 EnumProcesses 函数进行进程的枚举;
2、针对选中多个进程进行结束时的处理!
- vc++基础班[24]---系统各种路径信息的获取
vc++基础班[24]---系统各种路径信息的获取 ------------------------------------------ Begin ------------------------- ...
- vc++基础班[25]---系统信息的获取
--------------------------------------------------------------------------- VC 驿站 WwW.CcTry.CoM 多抽出一 ...
- vc++基础班[28]---动态数组及动态链表的讲解
C++中也有相应的动态数组.动态链表.映射表的模板类,就是STL中的:vector.list.map 他们属于C++标准中的一部分,对于程序的移植性来说也是不错的,但是在MFC编程中使用 CArray ...
- vc++基础班[26]---进程的相关操作
①.ShellExecute 进行进程的创建,属于 shell api: //int iRet = (int)ShellExecute(m_hWnd, _T("open"), ...
- vc++基础班[23]---文件夹的基本操作
①.文件夹的创建:CreateDirectory ※※※ 注意:此函数只能创建一层目录,比如想在 C 盘下的 Temp 目录下创建新目录为:123 那么前提是 Temp 这个目录存在才可以! ...
- vc++基础班[22]---文件的基本操作2
MFC 中的 CFile 及其派生类中没有提供直接进行文件的复制操作,因而要借助于SDK API: SDK中的文件相关函数常用的有CopyFile().CreateDirectory().Dele ...
- vc++基础班[21]---文件的基本操作之CFile
①.文件的创建.打开.关闭: 文件的创建.打开:CFile::Open 文件的关闭:CFile::Close CFile::modeCreate:以新建方式打开,如果文件不存在,则新建:如果文件已 ...
- PHP基础班初学感悟
不知不觉差不多一个月就过去了 刚到培训班那时候的心情,现在也还能有所感觉 作为今年6月份的毕业生,刚从大学的实习期出来,辞掉了上一份工作,本来是打算找一份更加与专业挂钩的工作做的 也许是90后对网络的 ...
- 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)
[SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ...
随机推荐
- 1.Eureka
分布式系统中,当B的数量越来越多的时候,A只需要从注册中心获取B注册的服务,而不需要直接从B中获取服务,答案显而易见. application.yml: eureka: client: service ...
- ES6checker ES6浏览器检测
检测地址如下: http://ruanyf.github.io/es-checker/index.cn.html Chrome 44检测结果如下:
- jQuery源码解析对象实例化与jQuery原型及整体构建模型分析(一)
//源码剖析都基于jQuery-2.0.3版本,主要考虑到兼容IE 一.关于jQuery对象实例化的逻辑: 整个jQuery程序被包裹在一个匿名自执行行数内: (function(window,und ...
- Java笔记——泛型擦除
1. 泛型擦除 package cn.Douzi.T_Demo; import java.util.ArrayList; /** * @Auther: Douzi * @Date: 2019/3/8 ...
- 029、限制容器的block IO(2019-01-24 周四)
参考https://www.cnblogs.com/CloudMan6/p/7016050.html Block IO ,是另一种可以限制容器使用的资源,block IO 指的是磁盘的读写,doc ...
- 错误 1 “Entities.PlanPrjEntity.PlanPrjs”不可访问,因为它受保护级别限制
本人第一次是用List做父类,写了一个类PlanPrjs,如下: class PlanPrj { public int ID { get; set; } public string Name { ge ...
- Java8新特性_日期时间新类 LocalDate、LocalTime、LocalDateTime
import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeForma ...
- 微信小程序开发(6) SSL证书及HTTPS服务器
1. 域名 在万网购买,略 2. 云服务器 阿里云购买,略 3. 安装lnmp 使用lnmp.org程序,略 4. 申请证书 阿里云-管理控制台-安全(云盾)-证书服务-购买证书证书类型: 免费型DV ...
- MVC异步AJAX的三种方法(JQuery的Get方法、JQuery的Post方法和微软自带的异步方法)
异步是我们在网站开发过程中必不可少的方法,MVC框架的异步方法也有很多,这里介绍三种方法: 一.JQuery的Get方法 view @{ Layout = null; } <!DOCTYPE h ...
- 解决shell脚本中 telnet ap自动输入用户名和密码以及回车符
#!/bin/bash function change_ap { ( s=`stty -g`; str=$"\n" sstr=$(echo -e $str) stty raw -e ...