首页 > 编程语言 >C#开发单实例应用程序的几种方式

C#开发单实例应用程序的几种方式

时间:2024-07-08 09:42:23浏览次数:11  
标签:C# 应用程序 实例 窗体 base 进程 方法 ApplicationBase

C#默认的WinForm模板是不支持设置单实例的,也没有隔壁大哥VB.NET那样有个“生成单个实例应用程序”的勾选选项(VB某些时候要比C#更方便),实现单实例可以有多种方法:

  • 检测同名进程:Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName),如果集合的Length > 1那就表明已有同名进程了,如果有需要还可以进一步检查该进程的路径;
  • 命名互斥锁:Mutex,网上介绍的很多都是这种方法;
  • 锁定文件:使用File.Create方法创建文件并在程序退出时释放,如果创建失败则表明已经有实例在运行;
  • VB.NET方法:WindowsFormsApplicationBase,个人认为该方法最完美,可以接收后续进程的启动参数,还可以弹出前序进程的主窗体。

WindowsFormsApplicationBase是一个Microsoft.VisualBasic.ApplicationServices命名空间下的类,是微软为VB.NET实现应用程序启动控制的类,其内部是以命名管道通信来实现的。既然是同一个爹的东西,C#拿过来用毫无违和感。Microsoft.VisualBasic和Microsoft.CSharp一样,都是.NET Framework中的一部分,不用担心会缺少运行环境。

WindowsFormsApplicationBase类的一些常用属性和方法:

  • 属性IsSingleInstance:设置当前进程是否为单实例进程,在构造方法中设置,如果是后续进程且为值true,构造方法结束后会给前序进程发送启动参数,然后就退出进程了,不会执行到下面的OnStartup;
  • 方法OnStartup:首次启动后运行,返回false就会退出进程,后续进程永远不会运行到该方法;
  • 方法OnStartupNextInstance:后续进程启动后的重写方法,前序进程会接收到后续进程的启动参数,弹出主窗体等;
  • 方法OnCreateMainForm:创建主窗体的重写方法,必须指定主窗体。

创建一个单实例应用程序并响应后续进程参数的大概过程:

  • 创建一个项目名称为“SingleInstanceSample”的Windows窗体项目;
  • 添加引用“Microsoft.VisualBasic”;
  • 重命名“Form1”为“MainForm”;
  • 添加类“ApplicationBase.cs”,继承自“WindowsFormsApplicationBase”;
  • 修改“Program.cs”,从“ApplicationBase”启动。

各个类的代码如下:

  • Program.cs 
复制代码
 1 using System;
 2 using System.Windows.Forms;
 3 
 4 namespace SingleInstanceSample
 5 {
 6     internal static class Program
 7     {
 8         [STAThread]
 9         static void Main(string[] args)
10         {
11             Application.EnableVisualStyles();
12             Application.SetCompatibleTextRenderingDefault(false);
13 
14             var app = new ApplicationBase();
15             app.Run(args);
16         }
17     }
18 }
复制代码
  • ApplicationBase.cs
复制代码
 1 using Microsoft.VisualBasic.ApplicationServices;
 2 using System.IO;
 3 
 4 namespace SingleInstanceSample
 5 {
 6     internal class ApplicationBase : WindowsFormsApplicationBase
 7     {
 8         public ApplicationBase() : base(AuthenticationMode.Windows)
 9         {
10             //指示进程为单进程:IsSingleInstance
11             base.IsSingleInstance = true;
12             base.SaveMySettingsOnExit = true;
13             base.ShutdownStyle = ShutdownMode.AfterMainFormCloses;
14         }
15 
16         /// <summary>
17         /// 首次启动后的重写方法,返回false就会退出进程,
18         /// 比如可以显示登录窗体,登录失败返回false就不会运行到OnCreateMainForm
19         /// </summary>
20         protected override bool OnStartup(StartupEventArgs eventArgs)
21         {
22              base.OnStartup(eventArgs);
23 
24             //处理当前进程的启动参数
25 
26             return true;
27         }
28 
29         /// <summary>
30         /// 后续进程启动后的重写方法
31         /// </summary>
32         protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
33         {
34             base.OnStartupNextInstance(eventArgs);
35 
36             //处理后续进程的启动参数
37         }
38 
39         /// <summary>
40         /// 指定主窗体,
41         /// 除非OnStartup返回false,否则必须指定主窗体
42         /// </summary>
43         protected override void OnCreateMainForm()
44         {
45             base.MainForm = new MainForm();
46         }
47     }
48 }
复制代码

 

2024-07-08 09:32:10【出处】:https://www.cnblogs.com/yiluxiangdong/p/18288392

=======================================================================================

标签:C#,应用程序,实例,窗体,base,进程,方法,ApplicationBase
From: https://www.cnblogs.com/mq0036/p/18289317

相关文章

  • C#开发一个混合Windows服务和Windows窗体的程序
    很多时候,我们希望服务程序可以直接运行,或者可以响应一些参数,这时候,混合Windows服务和Windows窗体的程序就排上用场了。要实现同时支持Windows服务和Windows窗体,需要在启动的第一步时判断当前运行环境是否为服务模式,可以从以下几个方面进行判断:会话ID:Process.SessionId,获取当前......
  • SSM-企业人事信息管理系统-98194(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、
    企业人事信息管理系统的设计与实现摘 要由于数据库和数据仓库技术的快速发展,企业人事信息管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。人事管理系统对处理对象和服务对象,自身的系统结构,处理能力,都将适应技术发展的要求发生重大的变化。企业人事......
  • C#实现控制台传参调用YoloV5进行人体识别
    一、项目地址 二、代码解析3、自定义人体信息类  该类用于在控制台打印人体位置信息///<summary>///人体信息///</summary>publicclassBodyInfo{publicintLeft{get;set;}=0;publicintTop{get;set;}=0;......
  • centos8(linux): 安装使用supervisor管理laravel队列
    一,什么是supervisorSupervisor是一个进程控制系统,它使用户能够监视和控制类unix操作系统进程。它通过提供基于配置或事件启动、停止和重新启动进程的机制,帮助管理应该在系统中连续运行的进程。对于需要控制和监视Linux或其他类unix操作系统上多个进程的状态的开发人员和系统管理......
  • 木舟0基础学习Java的第十三天(Collection集合框架)
    Collection(根接口)集合框架数组和集合的区别:数组:既可以存储基本数据类型(值)又可以存储引用数据类型(地址值)    长度:数组的长度是固定的不能自动增长    使用环境:元素个数固定的时候集合:只能存储引用数据类型(对象)也可以存储基本数据类型(存储基本数据类型会自动......
  • R包:reticulate R对python的接口包
    介绍1R和python是两种不同的编程语言,前者是统计学家发明并且服务数学统计计算,后者则是最万能的胶水语言。随着大数据时代的到来,两者在数据分析领域存在越来越多的共同点且可以相互使用,为了破解二者的编程壁垒,CRAN收录了具有R接口的python包,从而使得两类语言的数据能共同使......
  • Win11系统提示找不到JSC.Resources.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个JSC.Resources.dll文件(挑选合适的版本文件)......
  • Win11系统提示找不到KBDCZ2.DLL文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个KBDCZ2.DLL文件(挑选合适的版本文件)把它放......
  • CC3利用链分析
    CC3利用链用到了动态加载类,我之前有写调用defineClass后还要进行newInstance实例化分析版本CommonsCollections3.1JDK8u65环境配置参考JAVA安全初探(三):CC1链全分析分析过程CC3链的RCE执行点是,ClassLoader的defineClass方法(还要实例化加载的类,去调用我们写在类......
  • CodeForces CF1986C Update Queries题解
    来吧,兄弟们,再来篇题解,其实也不是题解,是我自己的思路/心得/体会UpdateQueries题面翻译题目翻译一共$t$组数据,每组数据给定长度为$n$的字符串$s$,长度为$m$的$ind$数组和字符串$c$。你可以任意安排$ind$数组和字符串$c$的顺序,并按照此顺序对字符串$s$进行$m$......