前言
在公众号上看到一篇文章《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
解决程序多开的问题!
想了解更多内容,请关注我的个人公众号”My IO“