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

C++ Qt程序限制多开

代码

#include "mainwindow.h"#include <QApplication>
#include <QSharedMemory>
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication a(argc, argv);// 使用 QSharedMemory 实现单实例(禁止多开)// 这个 key 要在全局范围内唯一,建议用“公司名_产品名_应用名”这样的格式QSharedMemory sharedMemory("MyCompany_MyProduct_UntitledApp_SingleInstance");// 尝试创建一段共享内存,如果失败,说明已经有实例创建过它了if (!sharedMemory.create(1)) {QMessageBox::warning(nullptr,QObject::tr("提示"),QObject::tr("程序已经在运行中,禁止多开。"));return 0; // 直接退出,不再创建主窗口}MainWindow w;w.show();return a.exec();
}

原理简要说明
QSharedMemory sharedMemory(“…”):
创建一段带有全局唯一 key 的共享内存对象,所有进程都能看到这个 key。
sharedMemory.create(1):
第一次运行时,这块共享内存还不存在,创建成功,返回 true,程序正常继续。
第二次运行时,这块共享内存已经被第一次运行的程序创建了,再调用 create 会失败,返回 false。
检测失败就弹框并 return 0:
表示已经有实例在运行,直接退出,不再执行后面的 MainWindow w; w.show();。
如果你希望修改提示文字或唯一 key,只需要改 QSharedMemory 里的字符串和 QMessageBox 的文案即可。

如果想在第二次运行时直接弹出第一次的窗口,可以使用下面的代码来实现:

#include "mainwindow.h"#include <QApplication>
#include <QLocalServer>
#include <QLocalSocket>int main(int argc, char *argv[])
{QApplication a(argc, argv);// 单实例 + 激活已存在窗口:使用 QLocalServer / QLocalSocketconst QString serverName = "MyCompany_MyProduct_UntitledApp_SingleInstance";// 先尝试连接已有的 server,如果能连上,说明已有实例在运行QLocalSocket socket;socket.connectToServer(serverName);if (socket.waitForConnected(100)) {// 给已运行实例发一个简单消息,用于激活窗口socket.write("activate");socket.flush();socket.waitForBytesWritten(100);socket.disconnectFromServer();// 这里仍然需要退出当前进程,但旧实例会弹出/激活自己的窗口return 0;}// 如果之前异常退出,可能遗留 serverName,先清理一次QLocalServer::removeServer(serverName);QLocalServer server;server.listen(serverName);MainWindow w;w.show();// 当有“第二个实例”连上来时,激活当前窗口QObject::connect(&server, &QLocalServer::newConnection, &w, [&]() {QLocalSocket *clientConnection = server.nextPendingConnection();if (clientConnection) {clientConnection->readAll(); // 简单读一下消息,不做处理clientConnection->disconnectFromServer();clientConnection->close();clientConnection->deleteLater();}w.showNormal();w.raise();w.activateWindow();a.setActiveWindow(&w);});return a.exec();
}
http://www.dtcms.com/a/618065.html

相关文章:

  • 数据结构算法-哈希表:四数之和
  • 杭州翰臣科技有限公司优化方案物理必修三电子版
  • ASC学习笔记0024:移除一个现有的属性集
  • 洛阳做网站公司在哪建设工程信息管理网
  • win10安装miniforge+mamba替代miniconda
  • 旅游类网站策划建设_广告排版设计图片
  • Linux进程间通信三System V 共享内存完全指南原理系统调用与 C 封装实现
  • 云计算与大数据:数字化转型的双重引擎
  • 怎么弄免费的空间做网站铂爵旅拍婚纱摄影官网
  • 郑州中原区网站建设北京冬奥会网页设计
  • Java接口自动化测试之接口加密
  • 插值——Hermite 插值与分段三次 Hermite 插值
  • 外贸建站服务网站计划
  • tcp_Calculator(自定义协议,序列化,反序列化)
  • 【12】FAST角点检测:从算法原理到OpenCV实时实现详解
  • 设计模式实战精讲:全景目录
  • 【2025】 Java 从入门到实战:基础语法与面向对象三大特性巩固练习讲解(附案例练习与答案)
  • Linux:基础开发工具(四)
  • 【USACO25OPEN】It‘s Mooin‘ Time III B
  • OpenGL:Cube Map
  • 《玩转Docker》[应用篇17]:容器可视化管理平台-Docker安装部署Portainer
  • 开平 做一网站建设工程教育网建设工程类的考试辅导网站
  • 多线程 -- 初阶(4) [单例模式 阻塞队列]
  • 如何用VS2017做网站加盟商网站建设
  • HTML 基础知识二:创建容器和表格(附html实战案例)
  • OpenCV(二十八):双边滤波
  • 【2025CVPR物体姿态估计方向】ONDA-Pose:面向自监督六维物体姿态估计的遮挡感知神经域自适应方法
  • 衡阳网站建设开发价格推广关键词排名查询
  • MATLAB基于IOWA-云模型的长距离引水工程运行安全风险评价研究
  • 基层建设论文查询官方网站零基础怎么做电商