微软是如何解决 PC 端程序多开问题的

前言

在公众号上看到一篇文章《C#中解决PC端程序多开的问题》。

该文作者是通过创建互斥锁Mutex实现的:

bool mutexCreated;
var mutex = new Mutex(true, "MyApp", out mutexCreated);
if (mutexCreated)
{
    Application.Run(new Form1());
}
else
{
    MessageBox.Show("该程序已打开");
}

其实,VB.NET 的 WinForm 程序提供了一个更简单的实现方式:

无需任何代码,只需打个勾

现在很少有人用 VB.NET 了,能不能迁移相同功能到 C# 中呢?

原理

编译一个 VB.NET 的 WinForm 程序,反编译源代码,找到入口Main方法:

该入口类MyApplication继承自WindowsFormsApplicationBase基类,实际执行的基类的Run方法。

Run方法内部使用IsSingleInstance属性,判断是否启用单个实例应用程序

IsSingleInstance属性是在入口类的构造函数中赋值的:

public MyApplication()
    : base(AuthenticationMode.Windows)
{
    base.IsSingleInstance = true;
    base.EnableVisualStyles = true;
    base.SaveMySettingsOnExit = true;
    base.ShutdownStyle = ShutdownMode.AfterMainFormCloses;
}

实现

知道了原理,我们就可以改造 C# 的实现:

class Program :  WindowsFormsApplicationBase
{
    public Program()
    {
        IsSingleInstance = true;
    }

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

    [STAThread]
    static void Main(string[] args)
    {
        new Program().Run(args);
    }
}

需要引用 NuGet 包 Microsoft.VisualBasic

接下来,让我们来验证一下。

我们的程序确实只能打开一次,第 2 次运行会将已运行的窗口激活。

结论

今天,我们通过引用Microsoft.VisualBasic解决程序多开的问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值