前言

继续学window编程,学呀学呀 学无止境,学到Windows进程相关API了。利用相关的API使用Qt写界面实现了一个简单的进程管理。主要用到 进程的创建、进程的枚举、线程的枚举、DLL的枚举、进程提权等功能。相关API的介绍可以看 C/C++:Windows编程—创建进程、终止进程、枚举进程、枚举线程、枚举DLL

界面

先看看qt写的界面吧。

代码

创建进程

// 创建进程
void Widget::on_pushButton_6_clicked()
{QFileDialog *fileDialog = new QFileDialog(this);fileDialog->setWindowTitle(tr("打开可执行文件"));fileDialog->setDirectory(".");fileDialog->setNameFilter(tr("可执行文件(*.exe)"));fileDialog->setViewMode(QFileDialog::Detail);QStringList fileNames;if(fileDialog->exec()){QString fileName;fileNames =  fileDialog->selectedFiles();}QString exePath = fileNames[0];qDebug() << exePath;const char* path = exePath.toStdString().c_str();STARTUPINFOA startInfo = {0};startInfo.cb = sizeof(startInfo);PROCESS_INFORMATION processInfo = {0};// startInfo 和 processInfo必须初始化BOOL ret = CreateProcessA(path,NULL,NULL,NULL,false,NULL,NULL,NULL,&startInfo,&processInfo);if( ret ){qDebug() << "processId = " << processInfo.dwProcessId << ",threadId = "<< processInfo.dwThreadId ;CloseHandle( processInfo.hProcess );CloseHandle( processInfo.hThread );emit refreshProcTab();}else{qDebug() << "创建进程失败" ;}}

结束进程

// 结束进程
void Widget::on_pushButton_clicked()
{int row = ui->processTab->currentRow();uint pid = getPid();HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); // 获取进程句柄if( hProc == NULL){qDebug() << "OpenProcess error ";return;}BOOL ret = TerminateProcess(hProc,0); // 强制进程退出if(ret == FALSE){qDebug() << "TerminateProcess error ";return ;}ui->processTab->removeRow(row);CloseHandle(hProc);
}

停止进程

// 停止进程,就是将进程中的所有线程挂起
void Widget::on_pushButton_2_clicked()
{uint pid = getPid();HANDLE snapHandele = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,NULL);if( INVALID_HANDLE_VALUE == snapHandele){qDebug() << "CreateToolhelp32Snapshot error" ;return;}THREADENTRY32 entry = {0};entry.dwSize = sizeof(entry);BOOL ret = Thread32First(snapHandele,&entry);while( ret ){if( entry.th32OwnerProcessID == pid){HANDLE tHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,entry.th32ThreadID);if( tHandle == NULL){qDebug() << "OpenThread error,threadId = " << entry.th32ThreadID;}else{DWORD ret = SuspendThread(tHandle);if( ret == -1){qDebug() << "SuspendThread error";}else{qDebug() << "SuspendThread success";}CloseHandle(tHandle);}}ret = Thread32Next(snapHandele,&entry);}CloseHandle(snapHandele);
}

恢复进程

// 恢复进程,就是将进程中的所有线程恢复
void Widget::on_pushButton_3_clicked()
{uint pid = getPid();HANDLE snapHandele = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,NULL);if( INVALID_HANDLE_VALUE == snapHandele){qDebug() << "CreateToolhelp32Snapshot error" ;return;}THREADENTRY32 entry = {0};entry.dwSize = sizeof(entry);BOOL ret = Thread32First(snapHandele,&entry);while( ret ){if( entry.th32OwnerProcessID == pid){HANDLE tHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,entry.th32ThreadID);if( tHandle == NULL){qDebug() << "OpenThread error,threadId = " << entry.th32ThreadID;}else{DWORD ret = ResumeThread(tHandle);if( ret == -1){qDebug() << "SuspendThread error";}else{qDebug() << "ResumeThread success";}CloseHandle(tHandle);}}ret = Thread32Next(snapHandele,&entry);}
}

查看DLL

// 查看进程的DLL
// 查看某些系统进程的DLL是不行的,调用CreateToolhelp32Snapshot直接失败
// 必须提权,提权操作在upRole函数中
void Widget::on_pushButton_4_clicked()
{// 清空表格int rowCount = ui->dllTab->rowCount();for( int i = 0; i < rowCount; i++ ){ui->dllTab->removeRow(0);}uint pid = getPid();HANDLE snapHandele = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE ,pid);if( INVALID_HANDLE_VALUE == snapHandele){qDebug() << "CreateToolhelp32Snapshot error" ;return;}MODULEENTRY32 entry = {0};entry.dwSize = sizeof(entry);// 长度必须赋值BOOL ret = Module32First(snapHandele,&entry);int i = 0;while (ret) {QString dllFile = QString::fromWCharArray(entry.szModule);QString dllPath = QString::fromWCharArray(entry.szExePath);ui->dllTab->insertRow(i);ui->dllTab->setItem(i,0,new QTableWidgetItem(dllFile));ui->dllTab->setItem(i,1,new QTableWidgetItem(QString("%1").arg(dllPath)));i++;ret = Module32Next(snapHandele,&entry);}CloseHandle(snapHandele);
}

完整工程

工程代码在这里可以下载。或者这里下载最新代码。

Qt:Windows编程—Qt实现进程管理相关推荐

  1. Qt:Windows编程—Qt实现注册表启动项管理

    Qt实现注册表启动项管理 前言 Windows的开机启动项在很多地方都有设置,这次我们在注册表 子键"HKEY_LOCAL_MACHINE\Software\Microsoft\Window ...

  2. Qt界面编程-Qt简介

    一.Qt简介 Qt是什么 图形用户程序框架,是对底层应用编程接口API面向对象的封装. 是一套基于C++语言的类库,专注但不局限于图形用户界面的开发,也可以进行系统调用.网络编程.数据库.2D/3D图 ...

  3. 【Linux系统编程】Linux进程管理

    00. 目录 文章目录 00. 目录 01. 概述 02. 进程相关概念 03. 进程的状态 04. 进程调度 05. 程序调度函数 06. 附录 01. 概述 在Linux的内核的五大组成模块中,进 ...

  4. Qt:Windows编程—Qt实现本地服务管理

    Qt实现本地服务管理 前言 本节将使用Windows的几个API,使用qt实现 本地服务 简单管理.这里简单介绍下服务. 几乎每一种操作系统都有一种在系统启动时启动的进程机制,这种机制不会依赖于用户的 ...

  5. Qt:Windows编程—代码注入

    前言 ​ 这里所说的代码注入和上篇的DLL注入有类似之处.DLL文件的注入与卸载在上篇中都完成了,整个注入与卸载的过程其实就是让远程线程执行一次LoadLibrary函数或者FreeLibrary函数 ...

  6. Windows版Qt

    Windows版Qt Windows版Qt 支持的配置 Visual Studio工具 Windows版Qt Qt对不同Windows平台的支持广泛而成熟. 在开始之前,请确保您的开发环境满足要求. ...

  7. Qt:Windows编程—DLL注入与卸载

    前言 这里说的DLL注入 是将我们指定的DLL注入到指定的进程中,DLL卸载也就是将指定进程中的DLL卸载下来.在Windows提供的API中有 CreateRemoteThread函数 见名知意 创 ...

  8. 【C/C++ Windows编程】Windows系统消息、Qt消息事件、linux下kill信号

    Windows系统消息 文章目录 Windows系统消息 前言 一.什么是窗口? 二.什么是消息? 消息分类: windows消息机制架构图: 函数说明 消息结构体 GetMessage Transl ...

  9. myeclipse窗口布局控件任意_木辛老师的编程课堂:Python和Qt第2讲之布局管理初探(三)...

    在主窗口中放置多个控件,最好的方法是使用布局.控件的布局是学习PyQt路上比较关键也也是比较难理解的部分,赶快跟着木辛老师一起去看看吧. 请点击右上角"关注"按钮关注我们哟:跟着木 ...

最新文章

  1. linux环境变量堆栈,情景linux--如何摆脱深路径的频繁切换烦恼?
  2. 我终将失去了你,我的MSN君
  3. 年审是当月还是当天_车检是按月份还是日期 审车日期以什么为准
  4. MFC的GDI绘制坐标问题
  5. cocos2d-x学习笔记之图片分辨率适配
  6. 【前端】这可能是你看过最全的css居中解决方案了~
  7. phpcms网站搬家至服务器
  8. java 包装类型_2.Java基本类型与包装类型
  9. Python数据分析中Groupby用法之通过字典或Series进行分组
  10. 论文索引平台EI,SCI
  11. 盛迈坤电子商务:自然搜索排名的优化
  12. 腾讯云存储产品全线升级,满足更多高性能存储场景
  13. 简述计算机基本工作原理以及指令执行步骤,计算机的指令执行过程分为四步请简述它们简述...
  14. PS学习笔记----图层锁定
  15. linux usb 打印机命令
  16. keil里的debug项里没有 proteus vsm 51解决方案
  17. luoguP3625 APIO2009 采油区域
  18. HDMI接口类型种类区分图(高清图)
  19. i.MX RT开发笔记-02 | i.MX RT1062开发环境搭建(MDK芯片包、NXP SDK详解)
  20. java的冒泡_Java实现冒泡排序

热门文章

  1. NOI大纲 CSP初赛篇·知识大纲 CSP-入门级-NOI大纲
  2. 【chorme插件开发】第一节:chrome内核浏览器插件开发的说明
  3. Linux基础学习六:Nginx的使用教程
  4. number输入框限制输入数字位数、字体随数字长度变化
  5. Spring Shell笔记-help方法及exit及其他方法
  6. C++ | Qt 获取局域网中存在的主机(IP以及主机名)
  7. Qt|OpenGL学习笔记-绕X轴、Y轴、以及XY轴旋转的四边体
  8. 工科计算机考研311分今年能上吗,2020年考研,工科345分,能进大连理工吗?学姐:热门专业悬...
  9. Django获取request header信息
  10. gan怎么输入一维数据_时空序列预测模型GAN+LSTM