C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)

作者:junjie 时间:2023-06-16 07:54:29 

从 <<Windows Forms 2.0 Programming, 2nd Edition>>   -  Single-Instance Applications 这一章中, 学到了调用 VB.Net 中的 IsSingleInstance, 为 C# WinForm 添加只运行应用程序的单个实例 ( Single Instance Application). 是个好方法!

该方法显然从易用性上便捷与 Mutex 和 Process 这两种只运行单个应用程序实例的方法.

Single Instance 概念:

从.NET 2.0起,提供了WindowsFormsApplicationBase类来简化Windows应用程序编程,如果您是开发人员会感到感到奇怪,WindowsFormsApplicationBase类不在System.Windows.Forms 命名空间中而是属于Microsoft.VisualBasic.ApplicationServices 命名空间,也许这是作为VB.NET开发人员的优先好处吧。该类对应的程序集为Microsoft.VisualBasic.dll,不过该程序集包含在.NET框架中一起发布,如果要引用该程序集,在部署上不存在额外操作。

WindowsFormsApplicationBase类实现了类似于Application类的一些功能,不过该类还包含一些简化Windows Forms应用程序开发的接口,下面来简单了解一下。WindowsFormsApplicationBase类实现了对单实例应用程序的支持,通过设置IsSingleInstance 属性为True以及重写OnStartupNextInstance方法可以简洁的实现。

实现

在 Program.cs - Main 方法中
1. 项目中引用VB.Net 的DLL – Microsoft.VisualBasic.DLL,
Program.cs:

using Microsoft.VisualBasic.ApplicationServices;

2. 在Program.cs中增加一个类

Program.cs:


public sealed class SingleInstanceApplication : WindowsFormsApplicationBase
{
    public SingleInstanceApplication()
    {
        base.IsSingleInstance = true;
        base.ShutdownStyle = ShutdownMode.AfterMainFormCloses;
    }

    protected override void OnCreateMainForm()
    {
        base.MainForm = new MainForm();
    }

    protected override void OnStartupNextInstance(StartupNextInstanceEventArgs e)
    {
        base.OnStartupNextInstance(e);
        base.MainForm.Activate();
    }
}

3. 修改原 Application.Run(new MainForm()); 方法为:


//添加运行单进程程序
SingleInstanceApplication application = new SingleInstanceApplication();
application.Run(args);

SingleInstanceApplication类继承自WindowsFormsApplicationBase,在构造函数中设置为单实例模式,同时设置在主窗体关闭后退出应用程序。在继承类中,OnCreateMainForm方法被重写用来创建主窗体,如果要保证应用程序单一实例运行,还需要重写OnStartupNextInstance方法,在该应用程序的下一个应用程序实例启动时,OnStartupNextInstance方法会得到执行,在上面的实现代码中,调用基类方法同时激活主窗口。

标签:C#,单个实例,应用程序
0
投稿

猜你喜欢

  • Android中利用xml文件布局修改Helloworld程序

    2023-10-24 08:45:05
  • Android实现动态高斯模糊效果

    2021-07-02 16:56:09
  • Java异步调用转同步方法实例详解

    2023-11-01 20:38:25
  • Android实现文件下载进度显示功能

    2023-12-26 00:42:28
  • Java的Socket网络编程基础知识入门教程

    2021-11-19 10:10:37
  • springboot logback调整mybatis日志级别无效的解决

    2023-05-03 05:36:21
  • idea中MavenWeb项目不能创建Servlet的解决方案

    2022-07-09 19:26:11
  • SpringBoot自定义maven-plugin插件整合asm代码插桩

    2021-05-24 02:15:49
  • 解读List list=new ArrayList()是怎么回事

    2022-04-17 12:28:22
  • Java中BufferedReader和BufferedWriter使用方式

    2022-01-06 15:06:05
  • Unity3D实现相机跟随控制

    2021-09-03 08:38:01
  • Java中String、StringBuffer、StringBuilder的区别详解

    2023-03-28 00:06:50
  • Android自定义View实现投票进度条

    2022-04-02 13:57:21
  • Spring Boot与RabbitMQ结合实现延迟队列的示例

    2021-08-31 02:02:01
  • 基于C#解决库存扣减及订单创建时防止并发死锁的问题

    2023-03-16 20:59:53
  • Android实现彩信附件的添加与删除功能

    2023-04-14 01:02:28
  • Java如何使用spire进行word文档的替换详解

    2022-10-15 09:59:21
  • 浅谈对Java双冒号::的理解

    2023-09-20 02:19:21
  • java导出数据库的全部表到excel

    2023-11-25 09:38:33
  • Java微信公众平台之自定义菜单

    2021-09-10 15:36:10
  • asp之家 软件编程 m.aspxhome.com