软件编程
位置:首页>> 软件编程>> C#编程>> C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)

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

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

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

从 <<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方法会得到执行,在上面的实现代码中,调用基类方法同时激活主窗口。

0
投稿

猜你喜欢

  • private void btnSetOk_Click(object sender, EventArgs e)  &nb
  • 一、Android Color设置1、在xml文件中想设置颜色直接设置background的属性或者其他的color属性。随便设置一个颜色如
  • 本文实例为大家分享了JavaWeb实现用户登录与注册的具体代码,供大家参考,具体内容如下所用知识客户端:HTML CSS JS (JQuer
  • 背景很多时候我们使用WPF开发界面的时候经常会用到各种空间,很多时候我们需要去自定义控件的样式来替换默认的样式,今天通过两个方法来替换WPF
  • 之前一段时间,在朋友的推荐下,玩了探探这一款软件,初玩的时候,就发现,这款软件与一般的社交软件如陌陌之类的大相径庭,让我耳目一新,特别是探探
  • 文档中可通过应用不同的字体来呈现不一样的视觉效果,通过字体来实现文档布局、排版等设计需要。应用字体时,可在创建文档时指定字体,也可以用新字体
  • ProgressBar进度条当一个应用在后台执行时,前台界面不会有任何信息,这时,用户根本不知道程序是否在执行以及执行的进度等, 因此需要使
  • 引言java 7提供了另外一个很有用的线程池框架,Fork/Join框架理论Fork/Join框架主要有以下两个类组成. * ForkJoi
  • 一、背景TC 集群具有高可用架构,应用到集群是这样一个间接的关系:应用 -》事务分组 -》TC 集群,应用启动后所指定的事务分组不能变,可通
  •  这将会是一篇比较 * 的文章,当你想在某个人的生活中制造悲剧时你可能会去google搜索它。在Java的世界里,内存溢出仅仅只是你
  • 前言本来是打算用C#爬取天气网站上的信息,然后用正则表达过滤有用信息的,但是很淦,正则表达式太难了。无意间找到添加web引用的方式来获取天气
  • 我们知道HashMap集合是允许存放null值的hashMap是根据key的hashCode来寻找存放位置的,那当key为null时, 怎么
  • 本文实例为大家分享了Unity实现透视滑动列表的具体代码,供大家参考,具体内容如下1、目的有时候,为了实现更好的美术效果,需要实现一些特殊的
  • 登录接口实现public User queryUser(String UserName, String Password,HttpServl
  • 目录概述非阻塞算法依赖JCTools队列队列实现原子队列容量其他数据结构工具性能测试使用JCTools的缺点结论概述在本文中,我们将介绍JC
  • 一、关于idea中Maven的位置idea自带一个maven,其路径大致如下C:/java/IntelliJ IDEA 2020.1/plu
  • 一、Thread 类了解如何使用Thread 类实现多线程之后,继续学习Thread 类实现多线程之后的相关功能及方法。1、操作线程名称的方
  • 本文实例为大家分享了Java实现扑克牌程序的具体代码,供大家参考,具体内容如下思路:在实现之前,先要想好步骤,思路清晰才不会出错。要实现一副
  • 1、什么是反射?在java开发中有一个非常重要的概念就是java反射机制,也是java的重要特征之一。反射的概念是由Smith在1982年首
  • 本文实例讲述了Android发送xml数据给服务器的方法。分享给大家供大家参考。具体如下:一、发送xml数据:public static v
手机版 软件编程 asp之家 www.aspxhome.com