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

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 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739737.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mini-lsm通关笔记-字符相关操作

本文捋一下mini-lsm中的字符相关操作[u8] Vec<u8> Bytes Buf KeySlice KeyBytes[u8]和Vec<u8> 这两个是rust内置的数据类型。 [u8]: 切片本身并不拥有数据,而是引用了数据。它由一个指向数组开始处的指针和一个表示数组长度的计数器组成。[u8]类型通常写作&[u…

张高兴的 MicroPython 入门指南:(二)GPIO 的使用

目录什么是 GPIO使用方法使用微动开关点亮板载 LED硬件需求电路代码参考 什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即“通用输入输出”。 Raspberry Pi Pico 左右两侧各有一列 GPIO 引脚, Pico 通过这两列引脚进行一些硬件上的扩展,与传感器进行交互等等。…

MySQL-17.其他数据日志

C-17.其他数据日志 在之前的数据库事务的章节中,已经讲过,redo log和undo log。 对于线上数据库应用系统,突然遭遇数据库宕机怎么办?在这种情况下,定位宕机的原因就非常关键。我们可以查看数据库的错误日志。因为日志中记录了数据库运行中的诊断信息,包括了错误,警告和注…

如何恢复SSD NVME固态硬盘的数据恢复

一、使用数据恢复软件 操作步骤(以EaseUS Data Recovery Wizard为例): 安装软件:从EaseUS官网或其他可靠来源下载并安装EaseUS Data Recovery Wizard。 连接固态硬盘:将SSD NVMe固态硬盘连接到电脑上,并确保系统能够识别。 启动软件并选择恢复选项:打开EaseUS Data Reco…

raid5存储池已损毁硬盘数据

RAID 5存储池中的硬盘数据损毁是一个复杂的问题,因为它涉及到数据的冗余、存储方式以及恢复策略。 一、RAID 5的工作原理 RAID 5是一种使用条带化和奇偶校验技术的存储解决方案,它至少需要三个硬盘来构建。在这种配置中,数据和奇偶校验信息被分布在所有硬盘上,以提供数据冗…

SSD NVME固态 硬盘 数据恢复

SSD NVMe固态硬盘数据恢复是一个复杂但并非不可能的任务,以下是一些建议的方法和步骤: 一、了解数据恢复的基本原理 数据恢复的基本原理在于,即使文件在操作系统中被删除或格式化,其实际数据在硬盘的物理介质上可能仍然存在,只是被标记为可覆盖。 SSD NVMe固态硬盘与传统的…

磁盘阵列中raid5坏了一个硬盘数据恢复

RAID5数据恢复步骤包括备份数据、更换故障硬盘、重建RAID阵列和数据恢复注意事项。在恢复过程中,需遵循正确的步骤并保持冷静,不要尝试自行解决复杂的数据恢复问题,以免造成不可逆转的数据损失。完成恢复后,应进行完整性检查和验证。 一、概述 RAID 5是一种存储配置,它将多…

电脑开机检测不到硬盘怎么办 电脑检测不到硬盘问题解决

电脑开机检测不到硬盘,无法进入系统或者显示“Reboot and Select proper Boot device”等错误信息。这种情况可能会导致我们的数据丢失或者无法使用电脑。 一、电脑检测不到硬盘的可能原因 电脑检测不到硬盘的原因主要有以下几种:1、硬盘连接线松动或损坏:硬盘是通过SATA线或…

CentOS 7 下载 网络配置 ssh配置 JDK配置 Python3配置 Git配置 nvm配置 防火墙配置

背景 CentOS 8系统2021年12月31日已停止维护服务,CentOS 7系统将于2024年06月30日停止维护服务。CentOS官方不再提供CentOS 9及后续版本,不再支持新的软件和补丁更新。 所以我们如果要安装服务器操作系统就需要安装centos7。这里我是用虚拟机安装的centos7mini版,mini版本是…

IBM服务器raid1数据恢复

IBM服务器RAID1数据恢复是一个相对复杂的过程,因为RAID1涉及数据的镜像和冗余,但一旦数据丢失,恢复的可能性仍然存在。以下是一些建议的步骤和注意事项,以帮助您进行IBM服务器RAID1数据恢复: 一、停止使用受影响的服务器 一旦发现数据丢失,首要任务是停止使用受影响的服务…

服务器刷新BIOS后死机

服务器刷新BIOS后死机是一个比较常见的问题,可能由多种原因引起。 一、原因分析 BIOS文件问题: 刷新的BIOS文件可能本身就是坏的,或者与服务器硬件不兼容。 BIOS版本选择不当,也可能导致兼容性问题。 刷新过程问题: 刷新过程中突然断电或操作不当,可能导致BIOS损坏。 硬件…

其他计算机系统基础知识

计算机语言计算机语言是指用于人与计算机之间交流的一种语言,是人与计算机之间传递信息的媒介。计算机语言主要由一套指令组成,而这种指令一般包括表达式、流程控制和集合三大部分内容。表达式又包含变量、常量、字面量和运算符。 流程控制有分支、循环、函数和异常。 集合包…