前言
在公眾號上看到一篇文章《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解決程序多開的問題!