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++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
47 0
|
1月前
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
20 0
Linux c/c++文件的基本操作
|
2月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
1月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
49 0
|
1月前
|
Linux C++
Linux c/c++文件移动
这篇文章介绍了在Linux环境下,使用C/C++语言通过命令方式和文件操作方式实现文件移动的方法。
70 0
|
2月前
|
Linux API C++
超级好用的C++实用库之文件目录操作
超级好用的C++实用库之文件目录操作
32 0
|
2月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
21 0
|
6天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
29 5
|
13天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
40 4
|
14天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
38 4