C# WPF 單實例應用程序詳解
在 C# 中使用 WPF 創建單實例應用程序需要用到一種名為互斥體的技術。互斥體(mutual exclusion)旨在確保一次只能運行一個應用程序實例。
理解互斥體
互斥體充當應用程序資源的看門人。當應用程序創建互斥體時,它實際上“鎖定”了這些資源,阻止應用程序的任何其他實例訪問它們。此機制確保一次只能執行一個應用程序實例。
創建單實例 WPF 應用程序
要創建單實例 WPF 應用程序,請按照以下步驟操作:
1. 聲明互斥體:
在應用程序代碼中,聲明一個靜態 Mutex 對象。 true
參數指定互斥體最初由應用程序擁有,字符串參數是互斥體的唯一標識符。此標識符確保沒有其他應用程序可以使用相同的互斥體。
<code class="language-csharp">static Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");</code>
2. 檢查互斥體所有權:
應用程序啟動時,使用 WaitOne()
方法檢查它是否擁有互斥體。如果該方法返回 true
,則表示該應用程序是第一個實例,可以繼續執行。如果返回 false
,則表示另一個實例已經在運行。
<code class="language-csharp">if (mutex.WaitOne(TimeSpan.Zero, true)) { // 应用程序的第一个实例 } else { // 第二个实例,通知第一个实例并退出 }</code>
3. 通知現有實例:
如果應用程序不是第一個實例,則使用 PostMessage()
函數發送自定義消息來通知已運行的實例第二個實例的啟動嘗試。
<code class="language-csharp">NativeMethods.PostMessage( (IntPtr)NativeMethods.HWND_BROADCAST, NativeMethods.WM_SHOWME, IntPtr.Zero, IntPtr.Zero);</code>
4. 處理自定義消息:
在已運行的實例中,通過重寫主窗體的 WndProc
方法來處理自定義消息。
<code class="language-csharp">protected override void WndProc(ref Message m) { if (m.Msg == NativeMethods.WM_SHOWME) { ShowMe(); } base.WndProc(ref m); }</code>
5. 顯示正在運行的實例:
當已運行的實例接收到自定義消息時,可以使用 ShowMe()
方法將其置於前台。
<code class="language-csharp">private void ShowMe() { if (WindowState == WindowState.Minimized) { WindowState = WindowState.Normal; } // 获取当前的 "TopMost" 值(尽管我们的值始终为 false) bool top = Topmost; // 使我们的窗体跳转到所有内容的顶部 Topmost = true; // 将其设置回任何值 Topmost = top; }</code>
通過執行這些步驟,您可以創建一個單實例 WPF 應用程序,確保一次只有一個應用程序實例處於活動狀態。
以上是如何使用MUTEXES創建單個現實WPF應用程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!