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

C++ MFC 只启动一个程序实例 唤醒之前的实例(完整源码)

初级代码游戏的专栏介绍与文章目录-CSDN博客

         很多时候我们希望只允许启动一个程序实例,如果再次运行,就唤醒之前的实例。

目录

1 概述

2 相关技术介绍

2.1 互斥对象

2.2 查找窗口

2.3 唤醒窗口


1 概述

        技术上并不难,涉及到以下几个技术细节:

  1. 使用互斥对象,确保检查程序是否已经启动时没有并发错误。
  2. 查找之前已经运行的程序,可以通过窗口名称查找,也可以通过共享文件交互
  3. 控制之前已经运行的程序,可以通过发送窗口消息,也可以通过共享文件交互

        窗口程序通过窗口机制,查找和发消息都是操作系统的标准功能,如果 使用了配置文件,通过文件来交互也是可以的,只不过要定时查询,实时性没有发消息好。

2 相关技术介绍

        下面介绍相关代码:

2.1 互斥对象

	HANDLE hOneInstance;hOneInstance = ::CreateMutex(NULL, FALSE, L"自定义的名字");if (GetLastError() == ERROR_ALREADY_EXISTS){//在这里处理已经存在的情形//查找窗口、唤醒窗口,然后退出}//正常启动

        互斥对象是系统对象,本例中我们并不需要更多功能,只要检测创建是否成功即可。因为,互斥对象所有句柄被释放后就会被销毁,程序不退出,下一个程序创建会失败,程序退出后下一个就可以成功创建。对于我们的目的而言锁定互斥对象是不必要的。

        CreateMutes原型如下:

HANDLE CreateMutexA([in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,[in]           BOOL                  bInitialOwner,[in, optional] LPCSTR                lpName
);

        第一个参数涉及到权限,可以设置为NULL,第二个参数指示创建完成是不是要立即锁定,第三个参数是名字,可以不设置,设置的话不能和已经存在的内核对象同名,所有种类的内核对象共享同一个名字空间。

2.2 查找窗口

		HWND hWnd = FindWindow(NULL, TEXT("窗口标题"));if (IsWindow(hWnd)){//遍历处理所有同名窗口!!!while(IsWindow(hWnd)){//在这里处理窗口//查找下一个hWnd = FindWindowEx(NULL,hWnd,NULL,TEXT("窗口标题"));}}

        查找窗口的关键点是窗口标题必须正确,所以最好把窗口标题单独定义出来,并在窗口初始化里面专门设定一次,而且不要在程序里面修改窗口标题。这其实没法从技术上预防,程序的任何地方都可以随意修改窗口标题,如果没法掌控全部源代码,那就只好走文件控制的方式了。

        文件控制就是把窗口句柄写入文件,每次启动去文件里面读,读不到就是还没有程序实例在运行。

        这里写成循环是因为理论上可能有相同标题的窗口,需要这两个函数配合才能遍历所有同名窗口。

HWND FindWindowA([in, optional] LPCSTR lpClassName,[in, optional] LPCSTR lpWindowName
);

        FindWindow用窗口类名和/或窗口标题查找窗口,大部情况下我们只用窗口标题来查找。

HWND FindWindowExA([in, optional] HWND   hWndParent,[in, optional] HWND   hWndChildAfter,[in, optional] LPCSTR lpszClass,[in, optional] LPCSTR lpszWindow
);

        FindWindowEx查找子窗口。 

2.3 唤醒窗口

				// 显示if(!::ShowWindow(hWnd, SW_NORMAL)){//出错} // 激活if(!::SetForegroundWindow(hWnd)){//出错}

        这两句代码嵌入到之前查找窗口的循环里面即可将之前的实例的窗口显示到前端。

BOOL SetForegroundWindow([in] HWND hWnd
);

        这个函数的效果是把窗口放到前端并激活,输入焦点将设置到这个窗口中。

        如果想让窗口的标题栏闪烁,用这个API即可:

BOOL FlashWindow([in] HWND hWnd,[in] BOOL bInvert
);

        第二个参数为FALSE将保持之前的活动或非活动状态,为TRUE则切换状态。这个调用只闪烁一次,想多闪烁几次要用定时器来控制(不要用Sleep,会导致界面僵死)。

(这里是文档结束)

相关文章:

C++ MFC 只启动一个程序实例 唤醒之前的实例(完整源码)

初级代码游戏的专栏介绍与文章目录-CSDN博客 很多时候我们希望只允许启动一个程序实例,如果再次运行,就唤醒之前的实例。 目录 1 概述 2 相关技术介绍 2.1 互斥对象 2.2 查找窗口 2.3 唤醒窗口 1 概述 技术上并不难,涉及到以下几个技术…...

2024多云管理平台CMP排名看这里!

随着云计算技术的迅猛发展,多云管理平台CMP应运而生。多云管理平台CMP仅能够简化对多个云环境的统一管理,还能提高资源利用效率和降低成本。因此了解多云管理平台CMP品牌是必要的。2024多云管理平台CMP排名看这里!仅供参考哈! 20…...

MySQL 数据库的日志管理、备份与恢复

一. 数据库备份 1.数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中,数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。 造成数据丢失的原因: 程序错误人为,操作错误,运算错误,磁盘故障灾难(如火灾、地震&#xff0…...

一、Go开发环境搭建

文章目录 1、开发工具2、开发环境配置3、Hello World4、语法 1、开发工具 https://code.visualstudio.com/download 2、开发环境配置 类比Java的JDK,go的SDK下载:https://studygolang.com/dl 解压: 配置环境变量path,将命令&quo…...

包子凑数(蓝桥杯,闫氏DP分析法)

题目描述: 小明几乎每天早晨都会在一家包子铺吃早餐。 他发现这家包子铺有 N 种蒸笼,其中第 i 种蒸笼恰好能放 Ai 个包子。 每种蒸笼都有非常多笼,可以认为是无限笼。 每当有顾客想买 X 个包子,卖包子的大叔就会迅速选出若干笼…...

Java八股文(JVM)

Java八股文のJVM JVM JVM 什么是Java虚拟机(JVM)? Java虚拟机是一个运行Java字节码的虚拟机。 它负责将Java程序翻译成机器代码并执行。 JVM的主要组成部分是什么? JVM包括以下组件: ● 类加载器(ClassLoa…...

云硬盘扩容后将空间增加到原有分区的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

Tensorflow2.0笔记 - metrics做损失和准确度信息度量

本笔记主要记录metrics相关的内容,详细内容请参考代码注释,代码本身只使用了Accuracy和Mean。本节的代码基于上篇笔记FashionMnist的代码经过简单修改而来,上篇笔记链接如下: Tensorflow2.0笔记 - FashionMnist数据集训练-CSDN博…...

LeetCode 面试经典150题 290.单词规律

题目: 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 思路:一一映射需要用到…...

【CASS精品教程】CASS中计算四参数和七参数(以RTK数据为例)

文章目录 一、四参数介绍二、四参数计算三、七参数介绍四、四参数、七参数的区别一、四参数介绍 两个不同的二维平面直角坐标系之间转换通常使用四参数模型,四参数适合小范围测区的空间坐标转换,相对于七参数转换的优势在于只需要2个公共已知点就能进行转换,操作简单。 在…...

什么是RISC-V?开源 ISA 如何重塑未来的处理器设计

RISC-V代表了处理器架构的范式转变,特点是其开源模型简化了设计理念并促进了全球community-driven的开发。RISC-V导致了处理器技术发展前进方式的重大转变,提供了一个不受传统复杂性阻碍的全新视角。 RISC-V起源于加州大学伯克利分校的学术起点&#xff…...

展馆设计中展示有哪些要求

1、展示产品特点和功能 产品展示应突出产品的特点、功能和优势。通过使用适当的展示方式和展示环境,使观众能够直观地了解产品的外观、结构、性能等方面。可以使用实物展示、模型、原型、图表、动画等方式,以多种角度和视角展示产品的特点和功能。 2、提…...

python实战之PyQt5桌面软件

一. 演示效果 二. 准备工作 1. 使用pip 下载所需包 pyqt5 2. 下载可视化UI工具 QT Designer 链接:https://pan.baidu.com/s/1ic4S3ocEF90Y4L1GqYHPPA?pwdywct 提取码:ywct 3. 可视化UI工具汉化 把上面的链接打开, 里面有安装和汉化包, 前面的路径还要看…...

Switch 和 PS1 模拟器:3000+ 游戏随心玩 | 开源日报 No.174

Ryujinx/Ryujinx Stars: 26.1k License: MIT Ryujinx 是用 C# 编写的实验性任天堂 Switch 模拟器。 该项目旨在提供出色的准确性和性能、用户友好的界面以及稳定的构建。它已经通过了大约 4050 个测试,其中超过 4000 个可以启动并进入游戏,其中大约 340…...

免费翻译pdf格式论文

进入谷歌翻译网址https://translate.google.com/?slauto&tlzh-CN&opdocs 将需要全文翻译的pdf放进去 选择英文到中文,然后点击翻译 可以选择打开译文或者下载译文,下载译文会下载到电脑上,打开译文会在浏览器打开。...

3D产品可视化SaaS

“我们正在走向衰退吗?” “我们已经陷入衰退了吗?” “我们正在步入衰退。” 过去几个月占据头条的问题和陈述引发了关于市场对每个行业影响的讨论和激烈辩论。 特别是对于科技行业来说,过去几周一直很动荡,围绕费用、增长和裁…...

浙大版《C语言程序设计(第4版)》题目集-习题3-5 三角形判断

给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。 输入格式: 输入在一行中顺序给出六个[−100,100]范围内的数字,即三个点的坐标x1、y1、x2、y2、x3、y3。 输出格式: 若这3个点不能构成三角形,则在一行中输…...

Java封装、继承、多态和抽象深度解析

在软件工程的世界里,面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。对象可以封装数据和方法,以提高代码的复用性、可维护性和可扩展性。Java作为一门面向对象的编程语言,提供了四个基本的面向…...

深度学习每周学习总结P3(天气识别)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 数据链接 提取码:o3ix 目录 0. 总结1. 数据导入部分数据导入部分代码详解:a. 数据读取部分a.1 提问:关…...

通过iOS网络抓包工具实现移动应用数据安全监控

摘要 本文将深入探讨iOS平台上常用的网络抓包工具,包括Charles、克魔助手、Thor和Http Catcher,以及通过SSH连接进行抓包的方法。此外,还介绍了克魔开发助手作为iOS应用开发的辅助工具,提供的全方面性能监控和调试功能。 在iOS应…...

实时手机检测-通用企业应用案例:手机回收站自动分拣系统集成

实时手机检测-通用企业应用案例:手机回收站自动分拣系统集成 1. 引言:当手机回收遇上AI,效率革命正在发生 想象一下,一个大型的手机回收处理中心,每天要处理成千上万部来自不同渠道的旧手机。工人们需要手动将手机从…...

GME-Qwen2-VL-2B助力AIGC内容创作:自动为图片生成创意文案与故事

GME-Qwen2-VL-2B助力AIGC内容创作:自动为图片生成创意文案与故事 你有没有过这样的经历?面对一张精心拍摄的照片,却怎么也憋不出几句像样的文案。或者,看着一张充满故事感的图片,脑海里思绪万千,落到笔尖却…...

Qwen2.5-VL半监督学习效果展示:有限标注下的性能提升

Qwen2.5-VL半监督学习效果展示:有限标注下的性能提升 1. 引言 在AI视觉领域,标注数据一直是制约模型性能的关键因素。传统监督学习需要大量人工标注,成本高、周期长,让很多企业和研究者望而却步。但今天,随着半监督学…...

Apache Arrow Rust社区与生态:参与开源项目的最佳路径

Apache Arrow Rust社区与生态:参与开源项目的最佳路径 【免费下载链接】arrow-rs Apache Arrow Rust: 一个Rust语言实现的Apache Arrow数据交换格式,可用于高效地在不同计算引擎之间传输和操作大规模数据。它支持多种数据类型和编码方式,并提…...

智能邮件秘书:OpenClaw+Qwen3.5-9B自动分类与回复

智能邮件秘书:OpenClawQwen3.5-9B自动分类与回复 1. 为什么需要自动化邮件处理? 每天早晨打开邮箱时,看到堆积如山的未读邮件总会让人头皮发麻。作为一位经常需要处理客户咨询的技术顾问,我最高纪录是一天收到187封邮件。即使每…...

3类被90%开发者忽略的农田图像噪声——基于ISO 17202-2标准的Python去噪实战手册

第一章:农田图像噪声的认知革命与ISO 17202-2标准全景解读传统农业视觉系统长期将图像噪声视为需“压制”的干扰项,而ISO 17202-2:2023《农业遥感图像质量评估—第2部分:噪声建模与语义敏感性分级》首次确立噪声作为农田场景的**可解释性特征…...

告别黑盒调试:为VS2022和Halcon HImage定制一个带暗色主题的视觉化调试器

为VS2022和Halcon HImage打造沉浸式暗色调试器:从UI优化到高效开发实践 在计算机视觉开发领域,Halcon凭借其强大的图像处理能力成为工业检测、医疗影像等场景的首选工具。然而,长时间面对传统调试界面容易导致视觉疲劳,影响开发效…...

WavePWM库:嵌入式LED正弦调光算法与实现

1. WavePWM库概述:正弦波形LED调光的底层实现原理与工程应用 WavePWM是一个面向嵌入式LED驱动场景的轻量级波形PWM计算库,其核心价值不在于直接控制硬件引脚,而在于 以确定性数学模型生成高保真度的正弦(或类正弦/指数&#xff0…...

Abaqus数值模拟案例研究:随机纤维分布二维RVE模型中的微观横向拉伸损伤与延性损伤评估

abaqus数值模拟案例系列-随机纤维分布二维RVE模型微观横向拉伸损伤,设置了周期边界,采用Drucker-Prager(dp)准则,Ductile-Damage延性损伤,界面采用cohesive单元,采用牵引分离方法,Qu…...

注意力缺陷是什么?主要有哪几种症状及专注力训练方法?

注意力缺陷病因及其对儿童发展的影响分析 注意力缺陷(ADHD)的病因较为复杂,主要涉及遗传、环境和生物因素。研究表明,遗传因素在儿童注意力缺陷中起着重要作用,有些家族中更容易出现多动症状。与此同时,环境…...