C++ QT监测可执行文件exe是否运行

简介: C++ QT监测可执行文件exe是否运行

前言


一、原理

定义了一个CheckProcessThread类,该类继承自QThread,并在run()方法中实现了可执行文件的监测逻辑。在isProcessRunning()方法中,我们使用Windows API函数CreateToolhelp32Snapshot()和Process32First()/Process32Next()函数来遍历进程列表,查找可执行文件是否在运行。如果找到了该进程,我们返回true,否则返回false。

在main()方法中,我们创建了一个CheckProcessThread对象,并调用start()方法启动子线程。在子线程中,我们将不断地监测可执行文件是否在运行,直到子线程被中断。

需要注意的是,如果您使用Windows API函数来监测进程是否在运行,您需要包含Windows.h头文件。此外,Windows API函数可能会因为Windows版本不同而略微有所不同,因此您可能需要根据您的操作系统版本来调整代码。

二、实现

//CheckProcessThread.h
#pragma once
#include <QCoreApplication>
#include <QThread>
#include <windows.h>
#include <tlhelp32.h>
#include <QDebug>
class QThread;
class  CheckProcessThread : public QThread
{
  Q_OBJECT
public:
  explicit CheckProcessThread(QThread *parent = Q_NULLPTR);
  void run() override;
signals:
  void signal_is_open(bool isopen);
private:
  bool isProcessRunning(const QString& processName);
  void char_to_wchar(const char* ch, std::wstring& w_str);
};
//CheckProcessThread.cpp
#include "CheckProcessThread.h"
CheckProcessThread::CheckProcessThread(QThread *parent)
  : QThread(parent)
{
}
void CheckProcessThread::run() 
{
  while (!isInterruptionRequested()) {
  // 检测进程是否在运行
  if (isProcessRunning("XXX.exe")) { // 替换为您要监测的可执行文件名称
    emit signal_is_open(true);
    qDebug() << "Process XXX.exe is running";
  }
  else {
    emit signal_is_open(false);
    qDebug() << "Process XXX.exe is not running";
  }
  // 等待一段时间后再检查
  sleep(2);
  }
}
bool CheckProcessThread::isProcessRunning(const QString& processName)
{
  // 将QString转换为std::wstring
  std::wstring wProcessName = processName.toStdWString();
  HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapshot == INVALID_HANDLE_VALUE) {
  return false;
  }
  PROCESSENTRY32 pe;
  pe.dwSize = sizeof(PROCESSENTRY32);
  if (Process32First(hSnapshot, &pe)) {
  do {
    std::wstring wExeFile;
    char_to_wchar(pe.szExeFile, wExeFile);
    if (wExeFile == wProcessName) {
    CloseHandle(hSnapshot);
    return true;
    }
  } while (Process32Next(hSnapshot, &pe));
  }
  CloseHandle(hSnapshot);
  return false;
}
void CheckProcessThread::char_to_wchar(const char* ch, std::wstring& w_str)
{
  wchar_t* wchar;
  int len = MultiByteToWideChar(CP_ACP, 0, ch, strlen(ch), NULL, 0);
  wchar = new wchar_t[len + 1];
  MultiByteToWideChar(CP_ACP, 0, ch, strlen(ch), wchar, len);
  wchar[len] = '\0';
  w_str = wchar;
  delete[]wchar;
}
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    CheckProcessThread *thread = new CheckProcessThread;
    thread->start();
  connect(thread, &CheckProcessThread::signal_is_open, this, [=](bool isopen) {
  if (isopen)
  {
    //可执行启动
  }
  else
  {
    //可执行未启动
  }
  });
    return app.exec();
}

推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:

零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)

https://xxetb.xet.tech/s/VsFMs


相关文章
|
3月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
210 3
|
17天前
|
并行计算 C++ Windows
|
10月前
|
机器学习/深度学习 人工智能 API
如何在c++侧编译运行一个aclnn(AOL)算子?
CANN的AOL库提供了一系列高性能算子API,优化了昇腾AI处理器的调用流程。通过两段式接口设计,开发者可以高效地调用算子库API,实现模型创新与应用,提升开发效率和模型性能。示例中展示了如何使用`aclnnAdd`算子,包括环境初始化、算子调用及结果处理等步骤。
|
6月前
|
SQL 数据库连接 数据库
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
309 14
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
133 0
|
9月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
WK
|
11月前
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
364 5
|
12月前
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
154 0
Linux c/c++文件的基本操作
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
12月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
304 0