怎么让C#程序同时只能运行一个实例

双击一个WinForm程序,会打开一个界面,也即运行了一个程序的实例;双击多次的时候,会出现多个程序界面。有时候我们需要只允许程序只能同时运行一个实例。实现方式有很多。

一.   进程互斥

原理:通过获取系统进程列表,如果发现有重名的,则表示程序已经运行了,此时新运行的进程就退出;

实现:System.Diagnostics.Process类的静态方法GetProcessesByName(string processName)

Process[] ps = Process.GetProcessesByName("Guo.exe");

if (ps != null && ps.Length > 1)

{

   //发现重复进程

}

写在Main方法里;判断Length大于1,是因为本身启动之后也在进程列表里了,第一次启动的时候Length==1;

优点:代码简单;

缺点:会把别的重名程序误认为是自己(如很多软件都有update.exe);可以通过复制多个exe并起不同名字来达到运行多个实例的目的;

二.   共享锁(文件、注册表)

原理:运行程序时,在一个公共的位置创建一个共享值(如在固定目录创建一个文件,或者在固定的注册表位置创建一个值),退出程序时删除该值。若运行时发现值已经在,则表示程序已经在运行,此时新运行的进程就退出;

实现:略;

优点:逻辑好理解;

缺点:若程序没有正常退出,共享值没有被删除,会导致程序无法再启动;

三.   线程互斥

原理:通过一个唯一标识创建进程互斥体,启动时判断互斥体是否已经存在,若存在则表示是重复进程;

实现:使用System.Threading.Mutex

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        /// <summary>
        /// 需要定义为类变量,而非局部变量
        /// </summary>
        static System.Threading.Mutex _mutex;

        static void Main(string[] args)
        {
            //是否可以打开新进程
            bool createNew;
            
            //获取程序集Guid作为唯一标识
            Attribute guid_attr = Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(GuidAttribute));
            string guid = ((GuidAttribute)guid_attr).Value;
            _mutex = new System.Threading.Mutex(true, guid, out createNew);
            if (false == createNew)
            {
                //发现重复进程
            }
            _mutex.ReleaseMutex();
        }
    }
}

优点:真正能做到同一个程序只允许运行一个进程;

缺点:暂无

注意:如果用不同用户同时登陆windows,仍然可以各自运行一个实例;如果想要不同用户也只能运行一个实例,那么,上面的guid变量需要加上前缀“Global\\”,详细可参看http://www.csharpwin.com/csharpspace/12748r5312.shtml

转载于:https://www.cnblogs.com/jifengg/archive/2013/05/13/3075733.html

C#中仅运行一个程序实例的方法 在日常工作中,大家经常会遇到想要让程序同时只能有一个实例在内存中运行的情况。比如某些比较耗费资源的工具,或者占用了某些特定端口的程序,启动多个实例没有意义。那么我们是怎么实现这种限制的呢? 在C#中,一般我们有两种办法,都非常简单。 使用Mutex 在C#中有两种Mutex,一种是Local的,仅在创建的进程中可见,主要作用就是实现进程内线程之间的同步。还有一种是有名字的,也叫Global M... 阅读详情

相关推荐

C# WinForm 程序单实例运行,再次运行时激活前一个实例

一个简单的小程序,演示了winform程序如何运行单实例。当有实例运行时,再次单击,会激活第一个实例。 附主要源码: Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Threading; names

一个程序猿的故事 7610

让程序只运行一个实例的四种方法

 源代码下载:http://d.download.youkuaiyun.com/down/907655/magictong 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果有说明已经有一个实例在运行了,则当前程序通知用户怎样怎样,然后程序退出,当然方法有这么多,各自也就有自己的优缺点了。 

magictong的专栏 1万+

从信号到振镜:STM32F103 + XY2-100协议 + AM26LS31芯片的激光打标/雕刻系统信号链搭建指南

本文详细介绍了基于STM32F103微控制器和XY2-100协议的激光打标/雕刻系统信号链搭建方法。从数字振镜控制协议解析、AM26LS31差分驱动电路设计到信号完整性优化,提供了一套完整的解决方案,帮助工程师实现高精度激光控制系统的开发与调试。

weixin_42536058的博客 235

C#中的线程安全单例模式

单 例模式是广为流传的设计模式中的一种。本质上,单例模式是一个只允许创建一个实例,并提供对这个实例简单的访问途径的类。一般而言,单例模式在创建实例时 不允许传递任何参数-否则不同参数导致不同的实例创建,就会出现问题!(如果同一个实例可以被同参的不同请求所访问,那么工厂模式会更适合。)这篇文章只 针对无参创建的请求进行讨论。典型的,单例模式的应用往往是延后创建的(created lazily)---

syaguang2006的专栏 6073

STM32之W5500网络通信_w5500 profinet

*初始化8个socket*/setSHAR(ConfigMsg.mac);/*配置Mac地址*/setSUBR(ConfigMsg.sub);/*配置子网掩码*/setSIPR(ConfigMsg.lip);/*配置Ip地址*/setGAR(ConfigMsg.gw);/*配置默认网关*/setRTR(2000);/*设置溢出时间值*/setRCR(3);/*设置最大重新发送次数*/

2501_90250923的博客 1461

间充质干细胞衰老机制与抗衰老干预策略研究

干细胞技术在再生医学领域具有广阔应用前景,其中间充质干细胞(MSCs)因其多向分化潜能和免疫调节特性备受关注。细胞衰老是影响干细胞治疗效果的共性难题,表现为增殖能力下降、端粒缩短等特征。通过表观遗传学分析发现,衰老MSCs存在DNA甲基化异常和组蛋白修饰改变;线粒体功能障碍导致ATP产量锐减,ROS累积显著增加。针对这些机制,研究者开发了包括小分子化合物筛选、CRISPR基因编辑和三维培养优化在内的多种干预策略。这些技术在组织修复、抗衰老治疗等应用场景中展现出重要价值,例如可提升心肌梗死修复效率2.3倍,缩

weixin_33502772的博客 227

c#只启动一个程序

C#程序只运行一次,防止多次启动 原理就是查找进程中该程序的运行数量,如果超过一个,就弹出信息,退出运行。 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace SystemControl { static class Program { /// <sum

u012034472的博客 1878

告别QXDM:在Android Studio中调试与验证高通NV读写功能的完整流程

本文详细介绍了在Android Studio中调试与验证高通NV分区读写功能的完整流程,替代传统的QXDM工具。通过JNI接口层、HAL服务层和Diag通信层的架构设计,开发者可以在熟悉的IDE环境中高效完成NV操作,包括环境配置、错误处理和性能优化等关键实践。

weixin_27013291的博客 261

C# 限制程序只能运行一个程序(防多开)

//方法一:只禁止多个进程运行 using System; using System.Collections.Generic; using System.Windows.Forms; namespace DuoYeMianIE { static class Program { /// &lt;summary&gt; /// 应用程序的主入口点。 ...

Ziv的博客 1万+

【ESP32CAM+Android+OpenCV】自定义目标数据集、训练自己的OpenCV模型部署到手机APP并对ESP32CAM无线图传显示并实时检测识别目标_资料编号30

本项目实现自定义目标数据集(想检测什么就检测什么,按照本文教程自己来更换目标)、训练自己的OpenCV模型实时检测识别(pycharm工程)。手机APP(Android studio工程)部署OpenCV模型实现对ESP32CAM(arduino工程)无线WIFI图传过来的图像实时检测识别。 本文以火焰检测识别为例进行演示,通过该过程,结合本文可自定义尝试更换为其它目标的检测,例如更换为车辆、车牌、手势、人脸面部活动、人脸表情、火焰烟雾、行人、口罩、行为、水果、植物、农作物、建筑、损伤等等部署进行检测。

嵌入式阿齐Archie 3478

4位无符号比较器设计

4位无符号比较器设计

好好学习,天天向上 7891

使用一个程序同时启动多个程序(c#)

宿舍的肥仔每次开机就需要运行多个程序,他希望一个程序实现这些事情,所以写了个程序,大家有什么意见可以给我提出来,我会多加修改,谢谢,贴上源码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;usi...

weixin_34195142的博客 545

嵌入式Zephyr RTOS面试题及参考答案

在Zephyr中,为自定义外设编写Devicetree绑定(Bindings)有助于内核理解设备树中自定义外设节点的含义和属性。首先,需要创建一个.yaml格式的绑定文件,通常存放在目录下对应的子目录中,文件名应能反映外设的类型和功能。绑定文件的开头要定义基本信息,包括字段,用于简要描述外设的功能和用途;compatible字段,它是一个字符串列表,用于匹配设备树中自定义外设节点的compatible属性,设备树节点和绑定文件通过这个字段关联起来。接下来,要定义外设节点的属性。使用properties。

大模型大数据攻城狮的专栏 986

c# Winform 如何实现程序只能同时运行一个实例

Mutex appSingleton = new Mutex(false, "SingleInstance Alert");if (appSingleton.WaitOne(0, false)){   Application.Run(new Form1());}else{   MessageBox.Show("已经运行");}appSingl

wangshisen66的专栏 622

ubuntu emto-cpa安装与编译

ubuntu emto-cpa安装与编译

qq_45834835的博客 1436

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WinForm窗体应用程序只能运行一个实例

说明:即程序不能进行多开,只能运行一个。

275

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C#使用Mutex实现程序单实例运行

C#使用Mutex实现程序单实例运行 大家在开发程序的时候,有时需要限制程序,只能同时运行一个实例,实现此功能,对于VB.NET是非常容易的,只要指定一个属性即可,但是C#实现起来,就稍微繁琐了。 C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 ...

weixin_34405354的博客 180

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

进程管理程序java,控制运行中的application进程实例的个数-JSP教程,Java技巧及代码...

在c++中很容易实现控制应用程序只能运行一个进程实例,在c#中也很好实现,但在java中想要控制程序的实例数就是非常苦难的事情。究其原因,是因为c++和c#都是通过向windows注册表写数据来实现进程互斥,但java是跨平台的,不能用这种只能针对windows的方法来实现。因为java中进程之间非常独立,很少有可以共享的东西,所以只有找到可以在进程间共享的东西,才能实现进程的互斥。有两种东西可以...

weixin_34659856的博客 234

C# WinForm避免程序重复启动,限制程序只能运行一个实例

禁止多个进程运行,当重复运行时激活以前的进程 Program.cs: using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices; us...

加油! 3668

c# 程序只能运行一次(多次运行只能打开同一个程序)

代码参考: C#代码 程序只能运行一次!防止程序运行多个实例的方法有多种,如:通过使用互斥量和进程名等.而我想要实现的是:在程序运行多个实例时激活的是第一个实例,使其获得焦点,并在前端显示.主要用到两个API 函数:ShowWindowAsync 该函数设置由不同线程产生的窗口的显示状态。SetForegroundWindow 该函数将创建指定窗口的线程设置到前台,并且激活该窗

潇湘馆 1万+

C# WINFORM判断程序是否运行,且只能运行一个实例

C# WINFORM判断程序是否运行,且只能运行一个实例 判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种, 方法1:线程互斥 static class Program { private static System.Threading.Mutex mutex; /// /// 应用程序的主入

xiaobaibai1216的专栏 565

C# 只允许运行一个实例

    互斥进程(程序), 简单点说,就是在系统中只能有该程序的一个实例运行. 现在很多软件都有这功能,如Maxthon 可以设置为"只允许打开一个窗体",还有Bitcomet等. 我也是看到这些软件的这个功能才来研究这个问题的.  要实现程序的互斥,通常有三中方式,下面用 C#  语言来实现:实现方式一: 使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.C#实现如下: 

石头窝 9632

WinFrom 只能运行一个实例总结

WinFrom 只能运行一个实例以及全局异常处理 using System; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApp1 { static class Program { /// <summary> /// ...

AI浩 8703

c#限制程序只能运行一个实例

  using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Diagnostics; using System.Reflection;    namespace SystemTray ...

rayhuang110的专栏 297

独享舞台,让你的C# WinForms应用程序只运行一个实例的小技巧

本文详细介绍如何确保 WinForms 桌面应用程序只能运行一个实例,避免多个窗口带来的困扰,提升用户体验和系统资源利用率。快来看看吧!

yangshuquan的专栏 887

C# 创建互斥进程(程序只能运行一个实例)

C# 创建互斥进程(程序) 互斥进程(程序), 简单点说,就是在系统中只能有该程序的一个实例运行. 现在很多软件都有这功能,如Maxthon 可以设置为"只允许打开一个窗体",还有Bitcomet等. 我也是看到这些软件的这个功能才来研究这个问题的. 要实现程序的互斥,通常有4中方式,下面用 C# 语言来实现: 实现方式一: 使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.C#实现如下

一份耕耘一份收获 1443
上一篇: 用C#写一个报时软件
下一篇: C#中使用SHFileOperation调用Windows的复制文件对话框
abc2221
博客等级 码龄12年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值