構建單實例WPF應用程序的正確方法
在.NET WPF開發中,確保應用程序只能運行單個實例需要了解互斥鎖的概念。互斥鎖(或互斥對象)是一種同步機制,可防止多個線程或進程同時訪問共享資源。
要實現單實例功能,請按照以下步驟操作:
Mutex.WaitOne()
方法檢查互斥鎖是否可用。返回值為true
表示成功鎖定,而false
表示存在現有實例。 PostMessage()
)發送自定義消息以激活該實例。使用RegisterWindowMessage()
註冊自定義窗口消息,並覆蓋主窗體的WndProc()
以偵聽此消息。 PostMessage()
通知現有實例並退出。 高級技巧
本文檔中鏈接的文章提供了一種更高級的解決方案,它將互斥鎖方法與Application.Run()
方法結合使用,以確保只運行一個實例。它還包括在第二個實例嘗試啟動時將現有實例置於前台的功能。
代碼示例
以下是如何使用互斥鎖實現單實例功能的示例:
<code class="language-csharp">using System.Threading; using System.Windows; using static NativeMethods; public partial class App : Application { private static readonly Mutex mutex = new Mutex(true, "{Unique Identifier}"); protected override void OnStartup(StartupEventArgs e) { if (!mutex.WaitOne(TimeSpan.Zero, true)) { PostMessage((IntPtr)HWND_BROADCAST, WM_SHOWME, IntPtr.Zero, IntPtr.Zero); return; } base.OnStartup(e); // 注册自定义窗口消息以激活现有实例 WM_SHOWME = RegisterWindowMessage("WM_SHOWME"); // 覆盖WndProc以处理自定义消息 MainWindow.Default.WndProc += (sender, args) => { if (args.Msg == WM_SHOWME) { if (WindowState == WindowState.Minimized) WindowState = WindowState.Normal; bool top = Topmost; Topmost = true; Topmost = top; } }; // 正常启动应用程序 MainWindow window = new MainWindow(); window.Show(); } protected override void OnExit(ExitEventArgs e) { // 应用程序关闭时释放互斥锁 mutex.ReleaseMutex(); base.OnExit(e); } // NativeMethods 类此处省略,以简洁起见 }</code>
請注意,NativeMethods
類在此處省略了,因為它包含平台相關的代碼。 你需要根據你的需求自行實現。 {Unique Identifier}
也需要替換為一個唯一的標識符,例如你的應用程序的GUID。
以上是如何使用MUTEXES實現單個現代WPF應用程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!