LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

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

freeflydom
2024年9月7日 21:57 本文热度 707

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 

using System;

using System.Windows.Forms;


namespace SingleInstanceSample

{

    internal static class Program

    {

        [STAThread]

        static void Main(string[] args)

        {

            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);


            var app = new ApplicationBase();

            app.Run(args);

        }

    }

}

ApplicationBase.cs

using Microsoft.VisualBasic.ApplicationServices;

using System.IO;


namespace SingleInstanceSample

{

    internal class ApplicationBase : WindowsFormsApplicationBase

    {

        public ApplicationBase() : base(AuthenticationMode.Windows)

        {

            //指示进程为单进程:IsSingleInstance

            base.IsSingleInstance = true;

            base.SaveMySettingsOnExit = true;

            base.ShutdownStyle = ShutdownMode.AfterMainFormCloses;

        }


        /// <summary>

        /// 首次启动后的重写方法,返回false就会退出进程,

        /// 比如可以显示登录窗体,登录失败返回false就不会运行到OnCreateMainForm

        /// </summary>

        protected override bool OnStartup(StartupEventArgs eventArgs)

        {

             base.OnStartup(eventArgs);


            //处理当前进程的启动参数


            return true;

        }


        /// <summary>

        /// 后续进程启动后的重写方法

        /// </summary>

        protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)

        {

            base.OnStartupNextInstance(eventArgs);


            //处理后续进程的启动参数

        }


        /// <summary>

        /// 指定主窗体,

        /// 除非OnStartup返回false,否则必须指定主窗体

        /// </summary>

        protected override void OnCreateMainForm()

        {

            base.MainForm = new MainForm();

        }

    }

}

转自https://www.cnblogs.com/yiluxiangdong/p/18288392 作者一路向东


该文章在 2024/9/9 9:58:56 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved