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

从 <<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)

相关推荐

  • 获取客户端IP地址c#/vb.net各自实现代码

    公司的域环境内,程序要求获取客户端的IP地址,分部程序码分享于此. C#: VB.NET:

  • ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数第1/2页

    最近因项目需要用ACCESS做数据库开发WEB项目 看论坛上还许多人问及ACCESS被注入的安全问题 许多人解决的方法仍然是用Replace替换特殊字符,然而这样做也并没有起到太大做用 今天我就把我用ACCESS参数化查询的一些方法和经验和大家分享 希望对大家有所启发,有写的不对的地方希望高手们多多指教 ASP.NET 用OleDbCommand的new OleDbParameter创建参数货查询 ASP用Command的CreateParameter 方法创建参数化查询 (SQL储存过程查询也

  • 如何让C#、VB.NET实现复杂的二进制操作

    相应的类库可在我的资源页面中找到,关于类成员的说明可通过对象浏览器查看函数说明 复制代码 代码如下: Imports BitOperatorLibrary.ShiftOperation.CircularShiftOperationImports BitOperatorLibrary.ShiftOperation.NormalShiftOperationImports BitOperatorLibrary.bitConvert Module Module1 Sub Main()        Co

  • asp.net 程序性能优化的七个方面 (c#(或vb.net)程序改进)

    1.使用值类型的ToString方法 在连接字符串时,经常使用"+"号直接将数字添加到字符串中.这种方法虽然简单,也可以得到正确结果,但是由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中.但是装箱操作对性能影响较大,因为在进行这类处理时,将在托管堆中分配一个新的对象,原有的值复制到新创建的对象中. 使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能. int num=1; string str="go"+num.T

  • C#中的除法运算符与VB.NET中的除法运算符

    VB.NET中的除法运算符有两个:/(浮点除法).\(整数除法) C#中的除法运算符只有一个:/(除法) VB.NET中的除法运算符与C#中的除法运算符存在很大的差异,使用时注意区分. 关于VB.NET中的除法运算符的介绍(摘自MSDN): /(浮点除法):将两个数相除并返回以浮点数表示的结果. 所得结果的数据类型取决于操作数的类型. 下表显示如何确定结果的数据类型. 操作数数据类型 结果数据类型 两个表达式都是整数数据类型(SByte.Byte.Short.UShort.Integer.UIn

  • C#、vb.net及SQL判断指定年份是否为闰年的方法

    本文实例讲述了本文章介绍了在c#,vb.net,sql中来判断指定日期是否为闰年的方法.分享给大家供大家参考.具体实现方法如下: C#代码如下: 复制代码 代码如下: public bool IsLeapYear(int year) {         if ((year < 1) || (year > 9999))         {             throw new ArgumentOutOfRangeException("year", "年份必须是

  • C# VB 实现10进制 16进制之间互相转换

    方法1: 复制代码 代码如下: int d=10; d.ToString("x") //或把x改为X,,,就变成了16位的字符串了. int x=Convert.ToInt32(d.ToString("x"),16);//把16进制的字符串变回10进制的. 方法2: 复制代码 代码如下: static void Main() { int i = 446; string hex = i.ToString( "X" /* or x * ); Cons

  • asp.net 验证码的简单制作(vb.net+C#)

    网站上验证码效果一般制作方法是: 1)使用HttpHandler(一般处理程序)绘制随机验证码的图,以及产生随机码,并输出到页面的OutputStream中. 2)页面中使用异步方式(js等)进行刷新当前页面的验证码. [示例] 1)创建一个"一般应用处理程序ashx",代码如下: [C#] 复制代码 代码如下: public class ValidationCode : IHttpHandler { //随机发生器 static Random r = new Random(Guid.

  • 在C#中调用VBScript、javascript等脚本的实现代码

    一.使用MSScriptControl 到微软的网站上下载Windows Script Control,它是一个ActiveX(R) 控件,所以在.NET中使用我Interop了一下.下载安装完成后,新建一个C#的Windows应用程序项目,在解决方案资源管理器中选中引用节点,右键点击选择添加引用菜单,弹出添加引用对话框,单击浏览找到安装Windows Script Control的目录,选取msscript.ocx文件确定.那么在引用节点下会增加一个MSScriptControl组件,下面是他

  • C#中调用VB中Inputbox类的实现方法

    C#自己没有Inputbox这个类,但是Inputbox也蛮好用的,所以有两种方法可以使用 一:间接调用vb中的Inputbox功能 1.在项目中添加对Microsoft.VisualBasic引用       2.在项目中添加命名空间Using Microsoft.VisualBasic;       3.以后就可以直接使用VB中的好多类库(爽啊--) 例如:textBox1.Text=Microsoft.VisualBasic.Interaction.InputBox("提示性文字"

  • C#调用VB进行简繁转换的方法

    本文实例讲述了C#调用VB进行简繁转换的方法.分享给大家供大家参考.具体分析如下: 首先在C#项目中引用Microsoft.VisualBasic.dll,版本自己选择合适的 然后在项目中添加引用:using Microsoft.VisualBasic; 转换: 转为繁体: outputText=Strings.StrConv(txt待转换文本, VbStrConv.TraditionalChinese); 转为简体: outputText=Strings.StrConv(txt待转换文本, V

  • C#利用ScriptControl动态执行JS和VBS脚本

    ScriptControl接口 属性名称 类型 备注 AllowUI BOOL 检测是否允许运行用户的接口元素.如果为False,则诸如消息框之类的界面元素不可见. CodeObject Object 脚本暴露给宿主调用的对象.只读. Modules Modules 宿主提供给脚本的组件库模块.只读.(COM组件通常都是以对象收集的形式向用户提供可以留给用户二次开发的对象集合,每一个收集即一个Modules) Language String 设置或获取脚本引擎解释的语言,例如:VBScript.

  • javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同

    1.<script language="javascript"> var str = "ajfhslajd and"; //在此我想将字母a替换成字母A alert(str.replace("a","A")); </script> 结果:是只有替换了字符串的首字符a 这不是我要的结果 看↓ 2.replace()支持正则表达式,它可以按照正则表达式的规则匹配字符或字符串,然后给予替换! <scri

随机推荐