首页 > 系统相关 >C#开发单实例应用程序并响应后续进程启动参数

C#开发单实例应用程序并响应后续进程启动参数

时间:2024-07-07 13:08:49浏览次数:16  
标签:后续 启动 C# 应用程序 实例 窗体 base 进程

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 }

标签:后续,启动,C#,应用程序,实例,窗体,base,进程
From: https://www.cnblogs.com/yiluxiangdong/p/18288392

相关文章

  • [javascript]如何优雅的实现网页自动滚动
    在设计一些网站的时候,考虑到用户腾不开手,不想动的情况,就需要设计一个自动滚动的功能,我不提供gui界面的设计,只提供一个丝滑滚动的源码letscrollPercentage=0.02;//这个变量就是一秒滚动这个滚动节点的视窗的百分之几letscrollState=false;//true为正在滚动letscrollE......
  • CesiumJS【Basic】- #073 日月矢量
    文章目录日月矢量1目标2代码日月矢量1目标绘制对日矢量和对月矢量2代码/**@Author:alan.lau*@Date:2024-06-1611:15:48*@LastEditTime:2024-06-1611:43:02*@LastEditors:alan.lau*@Description:*@FilePath:\my-cesium......
  • C语言 会员卡计费系统
    设计一个会员卡计费管理系统。功能要求:(1)新会员登记。(将会员个人信息及此会员的会员卡信息进行录入。)(2)会员信息修改。(3)会员续费。(会员出示会员卡后,管理人员根据卡号查找到该会员的信息并显示。此时可以进行续费,续费后,提示成功,并显示更新后的信息。)(4)会员消费结......
  • 五、保存数据到Excel、sqlite(爬虫及数据可视化)
    五、保存数据到Excel、sqlite(爬虫及数据可视化)1,保存数据到excel1.1保存九九乘法表到excel(1)代码testXwlt.py(2)excel保存结果1.2爬取电影详情并保存到excel(1)代码spider.py(3)excel保存结果2,保存数据到sqlite2.1sqlite数据库2.2创建表2.3插入数据2.4查询数据2.5保存......
  • DAY 1: C语言异或(^)以及按位与(&)的用法
    1.异或(^)的定义        在C语言中,异或操作符是^。异或操作符用于对两个操作数执行按位异或运算,即只有在两个操作数对应位不同时,结果为1。即相同为0不同为1。2.重要结论    1.任何一个数,假定为a,0^a等于a(不进位计算求和),a^a等于0。        2.异或运......
  • CentOS 6.5 配置国内在线yum源和制作openssh 9.8p1 rpm包 —— 筑梦之路
    CentOS6.5比较古老的版本了,而还是有一些古老的项目仍然在使用。环境说明1.更换国内在线yum源CentOS6在线可用yum源配置——筑梦之路_centos6可用yum源-CSDN博客cat>CentOS-163.repo<<'EOF'[base]name=CentOS-$releasever-Base-163.com#mirrorlist=http://m......
  • CentOS 7.9 停止维护(2024-6-30)后可用在线yum源 —— 筑梦之路
    众所周知,centos7在2024年6月30日,生命周期结束,官方不再进行支持维护,而很多环境一时之间无法完全更新替换操作系统,因此对于yum源还是需要的,特别是对于互联网环境来说,在线yum源使用方便很多,而不需要去搭建本地yum源和内网yum源。这里以阿里云为例,其他国内开源镜像站类似。此处......
  • vCenter登录失败报500错误:no healthy upstream
    过了个周末登录vCenter的时候提示:HTTP状态500-内部服务器错误;重启服务后提示:nohealthyupstream。如下图:看到这个情况,肯定就是部分不服务异常了或者压根就没有启动。至于说因为啥异常还不得而知。想着登录管理服务(访问端口:5480)重启一下异常服务,结果提示证书过期。问题......
  • kubernetes集群部署:node节点部署和cri-docker运行时安装(四)
    安装前准备同《kubernetes集群部署:环境准备及master节点部署(二)》安装cri-docker在Kubernetes1.20版本之前,Docker是Kubernetes默认的容器运行时。然而,Kubernetes社区决定在Kubernetes1.20及以后的版本中逐步淘汰对Docker的直接支持,一直到Kubernetes1.24版本彻底......
  • 张高兴的 MicroPython 入门指南:(二)GPIO 的使用
    目录什么是GPIO使用方法使用微动开关点亮板载LED硬件需求电路代码参考什么是GPIOGPIO是GeneralPurposeInputOutput的缩写,即“通用输入输出”。RaspberryPiPico左右两侧各有一列GPIO引脚,Pico通过这两列引脚进行一些硬件上的扩展,与传感器进行交互等等。简单的......