前言
一、原理
定义了一个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