前言
今天,要分享一個(gè)小技巧,讓你的 WinForms 桌面應(yīng)用程序像明星一樣獨(dú)享舞臺(tái) —— 確保它在同一時(shí)間只能運(yùn)行一個(gè)實(shí)例!
這樣做有什么好處呢?
首先,它可以幫助用戶集中注意力,減少被多個(gè)窗口干擾的可能性。
其次,它能有效減少系統(tǒng)資源的使用,提高程序的穩(wěn)定性和響應(yīng)速度。
最重要的是,防止多個(gè)實(shí)例同時(shí)訪問(wèn)和修改共享數(shù)據(jù),確保數(shù)據(jù)的一致性和完整性。
……
聽(tīng)起來(lái)是不是很棒?
那么,如何實(shí)現(xiàn)這個(gè)功能呢?
接下來(lái),跟我的步驟一起動(dòng)手做一下吧!
Step By Step 步驟
1. 創(chuàng)建一個(gè)新的 WinForms 項(xiàng)目,命名為“WinOneDemo”
2. 編寫只允許一個(gè)程序?qū)嵗拇a
在 Program.cs
文件中編寫以下代碼,留意代碼中的注釋:
// 定義一個(gè)互斥體(Mutex),用于標(biāo)識(shí)應(yīng)用程序是否已經(jīng)在運(yùn)行
privatestatic Mutex mutex = null;
/// <summary>
/// 初始化全局互斥體,確保只有一個(gè)應(yīng)用程序?qū)嵗\(yùn)行
/// </summary>
private static void GlobalMutex()
{
bool newMutexCreated = false;
Process current = Process.GetCurrentProcess();
// 使用全局命名空間確保跨會(huì)話唯一
string mutexName = "Global\\" + current.ProcessName;
try
{
// 嘗試創(chuàng)建一個(gè)名為 mutexName 的互斥體
mutex = new Mutex(false, mutexName, out newMutexCreated);
}
catch
{
// 如果創(chuàng)建互斥體失敗(例如權(quán)限問(wèn)題),則等待一段時(shí)間后退出
Console.WriteLine($"Failed to create mutex: {ex.Message}");
Thread.Sleep(1000);
Environment.Exit(1);
}
// 如果互斥體已經(jīng)被創(chuàng)建,說(shuō)明已經(jīng)有實(shí)例在運(yùn)行
if (!newMutexCreated)
{
// 彈出警告消息框
MessageBox.Show("程序已經(jīng)在運(yùn)行中……","警告",MessageBoxButtons.OK);
Thread.Sleep(1000);
// 優(yōu)雅地退出新啟動(dòng)的實(shí)例
Environment.Exit(1);
}
}
[STAThread]
static void Main()
{
// 調(diào)用方法,確保只有一個(gè)實(shí)例運(yùn)行
GlobalMutex();
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
5. 運(yùn)行和測(cè)試
現(xiàn)在,你可以編譯并生成 exe 程序。
找到 WinForms 的輸出目錄,雙擊打開(kāi) WinOneDemo.exe
,這時(shí)候,應(yīng)用程序?qū)?huì)被打開(kāi)。
如果你繼續(xù)雙擊打開(kāi) WinOneDemo.exe
,你將看到一個(gè)提示 "程序已經(jīng)在運(yùn)行中……" 的警告消息框,如下圖所示:
總結(jié)
恭喜你!你已經(jīng)成功地讓你的 WinForms 應(yīng)用程序只能運(yùn)行一個(gè)實(shí)例,是不是感覺(jué)特別簡(jiǎn)單又有趣呢?
小技巧,大作用,希望它能讓你的應(yīng)用程序運(yùn)行更加穩(wěn)定和友好。
該文章在 2025/1/13 10:50:15 編輯過(guò)