Ce guide montre comment utiliser les mutex pour garantir une seule instance de votre application WPF s'exécute simultanément.
Comprendre les mutex dans les applications à instance unique
Un mutex (Mutual Exclusion Object) est une primitive de synchronisation. Il n'autorise qu'un seul thread ou un seul processus pour accéder à une ressource partagée à tout moment. Lorsqu'un thread acquiert un mutex, tous les autres threads tentant d'acquérir le même mutex sont bloqués jusqu'à ce qu'il soit libéré. Cela empêche les conflits lorsque plusieurs instances tentent d'accéder aux mêmes ressources.
Construire une application WPF à instance unique
Voici comment implémenter un comportement à instance unique dans votre application WPF à l'aide d'un mutex nommé:
Déclarer un mutex statique: Dans la classe principale de votre application, ajoutez une variable de mutex statique:
<code class="language-csharp">static Mutex mutex = new Mutex(true, "{GUID_HERE}"); </code>
Remplacer {GUID_HERE}
par un identifiant unique (GUID) à l'échelle mondiale pour votre application. Ce GUID garantit que différentes applications ne partagent pas accidentellement le même mutex. Vous pouvez générer un GUID à l'aide d'outils disponibles dans la plupart des ides.
Vérifiez les instances existantes dans Main
: dans la méthode Main
de votre application, vérifiez si le mutex peut être acquis:
<code class="language-csharp">if (!mutex.WaitOne(TimeSpan.Zero, true)) { // Another instance is already running. MessageBox.Show("Only one instance of this application can run at a time."); return; // Exit the new instance. } else { // This is the first instance. Application.Run(new MainWindow()); mutex.ReleaseMutex(); // Release the mutex when the application closes. }</code>
Gire les messages de fenêtre (facultatif): Pour amener l'application existante au premier plan lorsqu'une nouvelle instance est lancée, vous devrez gérer un message Windows personnalisé:
<code class="language-csharp">protected override void WndProc(ref Message m) { if (m.Msg == NativeMethods.WM_SHOWME) { ShowMe(); // A method to activate your main window. } base.WndProc(ref m); }</code>
Vous devrez également définir NativeMethods
et WM_SHOWME
(un ID de message personnalisé) et implémenter la méthode ShowMe()
pour mettre votre fenêtre principale au premier plan.
Envoyez un message personnalisé (facultatif): dans le bloc else
(où le mutex est acquis), envoyez un message personnalisé à toutes les instances existantes:
<code class="language-csharp">NativeMethods.PostMessage( (IntPtr)NativeMethods.HWND_BROADCAST, NativeMethods.WM_SHOWME, IntPtr.Zero, IntPtr.Zero);</code>
Avantages de cette approche:
Cette réponse améliorée offre une explication plus détaillée et structurée, clarifiant les étapes et les avantages. N'oubliez pas de gérer les exceptions potentielles et de mettre en œuvre les NativeMethods
et ShowMe()
nécessaires de manière appropriée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!