[QT]设置程序仅打开一个,再打开就唤醒已打开程序的窗口

需求:speedcrunch 这个软件是开源的计算器软件。配合launch类软件使用时,忘记关闭就经常很多窗口,强迫症,从网上搜索对版本进行了修改。

cpp 复制代码
#include "gui/mainwindow.h"

#include <QCoreApplication>
#include <QApplication>

#include <QSharedMemory>
#include <QMessageBox>

#include <Windows.h>
#include <WinUser.h>

int main(int argc, char* argv[])
{
    QApplication application(argc, argv);

    static QSharedMemory *singleApp = new QSharedMemory("SingleApp");//创建"SingleApp"的共享内存块
    if(!singleApp->create(1))//创建失败,说明已经有一个程序运行,
    {
        //弹出提示框注意:该提示应该在 qApp->quit();之前,否则提示框将会一闪而过
        //QMessageBox::information(NULL,"tips","The program is already running");
        QString name = "Qt5152QWindowIcon";//窗口的类名
        QString windowname = "SpeedCrunch";//窗口标题名
        HWND hwnd = FindWindow((LPCWSTR)name.unicode(),(LPCWSTR)windowname.unicode());//查找窗口句柄
        if (hwnd == 0) {
             QMessageBox::information(NULL,"tips","not find wind");
        }
        
        ShowWindow(hwnd,  SW_RESTORE);//激活并置顶窗口,ShowWindow里面的参数可以网上搜一下,不同功能不同参数
        SetForegroundWindow(hwnd);
        
        qApp->quit();//退出当前程序
        return -1;
    }

    QCoreApplication::setApplicationName("SpeedCrunch");
    QCoreApplication::setOrganizationDomain("speedcrunch.org");

    MainWindow window;
    window.show();

    application.connect(&application, SIGNAL(lastWindowClosed()), &application, SLOT(quit()));

    return application.exec();
}

差异图下图:

findwindow的方法需要添加user32的库,因为speedcrunch已经添加,则在编译文件中未改动。

效果:

相关推荐
爱笑的k1111 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
X1A0RAN12 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
熊猫钓鱼>_>13 小时前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
瑞雪兆丰年兮13 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
布莱克60515 小时前
Swift 常量详解:从 let 到编译期优化
服务器·开发语言·ssh·swift·常量·let
布莱克60515 小时前
Swift 可选类型(Optionals)详解:从原理到实战
开发语言·安全·ssh·swift·optional·可选类型
瑞雪兆丰年兮17 小时前
JavaWeb-day14-SpringBootWeb原理篇
java·开发语言·spring boot·spring·bean·mybatis·javaweb
SomeOtherTime19 小时前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔19 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆19 小时前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言