当前位置: 首页 > news >正文

Windows Qt打开外部程序

前言

使用QProcess可以在Qt程序中打开外部第三方程序,但是每次执行都会重复运行多次,所以在打开之前要先判断该进程是否已经启动过,如果已经打开过,则使用Window API将该程序窗口置顶展示。
在这里插入图片描述

代码

注意,使用了Windows 接口,只能在win平台使用。


#ifdef Q_OS_WIN
#include <windows.h>
#include <tlhelp32.h>
#endif
bool openExternalProgram(const QString &filePath)
{auto path = filePath.trimmed();qDebug() << __FUNCTION__ << "path" << path;if(!QFile::exists(path))return false;#ifdef Q_OS_WIN// 1) Windows: 如果进程已运行,则置顶其窗口并返回QString exeName = QFileInfo(path).fileName();// 查找目标进程PID(按可执行文件名匹配)DWORD foundPid = 0;HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (snap != INVALID_HANDLE_VALUE) {PROCESSENTRY32W pe;pe.dwSize = sizeof(pe);if (Process32FirstW(snap, &pe)) {do {QString name = QString::fromWCharArray(pe.szExeFile);if (name.compare(exeName, Qt::CaseInsensitive) == 0) {foundPid = pe.th32ProcessID;break;}} while (Process32NextW(snap, &pe));}CloseHandle(snap);}if (foundPid != 0) {// 根据PID枚举窗口并置顶第一个可见的顶层窗口struct WinEnumData { DWORD pid; HWND hwnd; } data{foundPid, nullptr};auto enumProc = [](HWND hwnd, LPARAM lParam) -> BOOL {WinEnumData* d = reinterpret_cast<WinEnumData*>(lParam);DWORD wpid = 0;GetWindowThreadProcessId(hwnd, &wpid);// 顶层窗口且可见if (wpid == d->pid && IsWindowVisible(hwnd) && GetWindow(hwnd, GW_OWNER) == nullptr) {d->hwnd = hwnd;return FALSE; // 找到后停止枚举}return TRUE;};EnumWindows(enumProc, reinterpret_cast<LPARAM>(&data));if (data.hwnd) {// 若窗口最小化,先恢复if (IsIconic(data.hwnd)) {ShowWindow(data.hwnd, SW_RESTORE);}// 置顶并激活SetForegroundWindow(data.hwnd);SetActiveWindow(data.hwnd);SetWindowPos(data.hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);qDebug() << "Process already running. Brought window to front.";return true;}}
#endif// 2) 未运行或未找到窗口,则启动新进程QStringList arguments; // 如有参数再添加QString workingDir = QFileInfo(path).absolutePath(); // 常见做法:以exe所在目录为工作目录bool ok = QProcess::startDetached(path, arguments, workingDir);if (!ok) {qDebug() << "startDetached failed. Check:"<< "\n  - File exists:" << QFileInfo(path).exists()<< "\n  - Executable:" << QFileInfo(path).isExecutable()<< "\n  - Working dir accessible:" << QDir(workingDir).exists()<< "\n  - Try quoting the path or using the overload with arguments.";} else {qDebug() << "Started successfully.";}return ok;
}

通过Windows接口判断程序是否已经启动,查找进程PID,如果找到该进程,则将其程序窗口置顶。如果没有找到,则使用QProcess::startDetached启动程序。

http://www.dtcms.com/a/578556.html

相关文章:

  • 怎么建设商品网站网站建设首选公司
  • 西宁网站建设加盟代理北京高端网站制作公司
  • 微信小程序minium自动化测试SOP
  • 如何做好电子商务网站开发企业网站博客上如何营销
  • 【LeetCode】103. 二叉树的锯齿形层序遍历
  • 车联网终端TBOX车载无线4G网络盒子知识详解
  • 什么网站能免费做公众号封面做一个平面网站的成本
  • 作业11.6
  • 做网站项目流程国外文件传输网站
  • 论文分享 |重新思考3D分割:Unified-Lift——端到端的高斯泼溅场景分割新范式
  • xwiki做的网站邢台同城
  • 网站建设工作台账饲料公司网站建设方案
  • 初识MYSQL —— 内置函数
  • 吉林大学建设工程学院 旧网站国外网站免费dns
  • Windows2019IIS+PHP+MySQL环境搭建教程
  • 安卓14移植以太网framework-connectivity-t 编译问题
  • 河南城乡建设部网站crm客户端
  • 浏阳市住房和城乡建设局的网站个人养老保险缴费标准
  • 服务器 网站建设弹幕播放器 wordpress
  • 酒店行业的网站建设杭州强龙网站建设
  • 响应式网站seo爱站关键词搜索
  • 快速排序算法详解:hoare、挖坑法、lomuto前后指针与非递归实现
  • 攻防世界-Misc-Banmabanma
  • 公司网站建设服务wordpress会员制
  • 启航网站建设做橱窗设计的网站
  • 晶圆厂(Fab)对超净服的穿着如何规范?
  • 河南如何做网站官网开发多少钱一个
  • 【算法详解】二叉树路径总和问题——DFS+回溯完整题解(Java实现)
  • 建设外围彩票网站抛丸机网站怎么做
  • 网站推广服务chuseo网页设计版权信息代码