QT使用QProcess类,判断某个进程是否存在

约定不等于承诺〃 2023-01-23 12:56 759阅读 0赞

文章目录

    • 前言
    • 介绍QProcess启动方式
    • 实现代码
    • 使用示例
    • win32判断进程是否存在
    • 额外扩展,如何杀死进程
      • win32实现杀死进程
      • QProcess结束进程

前言

需求是判断win系统中,Qt 拉起某个程序,如果程序不存在则拉起,存在则实现程序进程切换,如果要进行这样的逻辑操作,就必须要判断程序的进程是在存在,是否已经启动成功!下面是实现代码。

介绍QProcess启动方式

  • QProcess::execute(): 以阻塞的方式打开进程,当进程执行完后才会执行该进程后面的程序
  • QProcess::start(): 以子进程的方式打开进程,与打开的进程有关系(父子关系)
  • QProcess::startDetached(): 以隔离的方式打开进程,与打开它的进程无关系

实现代码

  1. bool IsProcessExist(const QString &processName)
  2. {
  3. QProcess process;
  4. process.start("tasklist");
  5. process.waitForFinished();
  6. QByteArray result = process.readAllStandardOutput();
  7. QString str = result;
  8. if(str.contains(processName))
  9. return true;
  10. else
  11. return false;
  12. }

使用示例

  1. qDebug() << IsProcessExist("TIM.exe");

参数说明:进程实际执行的 exe名字 ,可以通过任务管理器的详细信息看见,以及程序安装目录可以找到,详情下图可以看见。
在这里插入图片描述

win32判断进程是否存在

  1. #include <window.h>
  2. #include "tlhelp32.h"
  3. #include <string.h>
  4. using namespace std;
  5. //判断进程是否存在
  6. BOOL IsExistProcess(const char* szProcessName)
  7. {
  8. PROCESSENTRY32 processEntry32;
  9. HANDLE toolHelp32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  10. if (((int)toolHelp32Snapshot) != -1)
  11. {
  12. processEntry32.dwSize = sizeof(processEntry32);
  13. if (Process32First(toolHelp32Snapshot, &processEntry32))
  14. {
  15. do
  16. {
  17. int iLen = 2 * wcslen(processEntry32.szExeFile);
  18. char* chRtn = new char[iLen + 1];
  19. //转换成功返回为非负值
  20. wcstombs(chRtn, processEntry32.szExeFile, iLen + 1);
  21. if (strcmp(szProcessName, chRtn) == 0)
  22. {
  23. return TRUE;
  24. }
  25. } while (Process32Next(toolHelp32Snapshot, &processEntry32));
  26. }
  27. CloseHandle(toolHelp32Snapshot);
  28. }
  29. //
  30. return FALSE;
  31. }

额外扩展,如何杀死进程

win32实现杀死进程

  1. #include <window.h>
  2. #include "tlhelp32.h"
  3. #include <string.h>
  4. using namespace std;
  5. //通过进程名来杀死进程
  6. int KillProcess(LPCSTR processName)
  7. {
  8. PROCESSENTRY32 pe;
  9. DWORD id=0;
  10. HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  11. pe.dwSize = sizeof(PROCESSENTRY32);
  12. if(!Process32First(hSnapshot,&pe))
  13. {
  14. return 0;
  15. }
  16. while(1)
  17. {
  18. pe.dwSize=sizeof(PROCESSENTRY32);
  19. if(Process32Next(hSnapshot,&pe)==FALSE)
  20. {
  21. break;
  22. }
  23. //find processName
  24. if(wcsicmp(pe.szExeFile, processName)==0)
  25. {
  26. id = pe.th32ProcessID;
  27. break;
  28. }
  29. }
  30. CloseHandle(hSnapshot);
  31. //if(id == 0)
  32. // return ;
  33. //Kill The Process
  34. HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, id );
  35. if (hProcess != NULL)
  36. {
  37. TerminateProcess(hProcess,0);
  38. CloseHandle(hProcess);
  39. }
  40. return 1;
  41. }

QProcess结束进程

  1. // 例如 notepad.exe 为需要关闭的进程名
  2. QProcess p;
  3. QString c = "taskkill /im notepad.exe /f";
  4. p.execute(c);
  5. p.close();

另外一种写法:
cmd 终止进程方式:
终止进程名为test.exe的进程

  1. QStringList params;
  2. params << "-f" << "-im" << "test.exe";
  3. QProcess process;
  4. process.start("taskkill",params);

备注cmd命令:

  1. tasklist -fi imagename eq test.exe 显示进程名为test.exe的进程信息
  2. tasklist -fi imagename ne test.exe 显示进程名不为test.exe的进程信息
  3. tasklist -fi pid eq 1958 显示进程号为1958的进程信息
  4. taskkill -f -pid 1958 强制终止进程号为1958的进程
  5. taskkill -f -im test.exe 强制终止所有进程名为test.exe的进程树
  6. taskkill -f -fi imagename eq test.exe –强制终止所有进程名为test.exe的进程树

如果觉得博主写的不错的话,就请博主喝杯咖啡☕吧!!!
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,759人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Qt进程QProcess

    一、进程的介绍 设计应用程序时,有时不希望将一个不太相关的功能集成到程序中,或者是因为该 功能与当前设计的应用程序联系不大,或者是因为该功能已经可以使用现成的程序很