Maison >développement back-end >C++ >Comment garantir qu'une seule instance d'une application WPF s'exécute à la fois?

Comment garantir qu'une seule instance d'une application WPF s'exécute à la fois?

Patricia Arquette
Patricia Arquetteoriginal
2025-02-02 07:31:09413parcourir

How to Ensure Only One Instance of a WPF Application Runs at a Time?

Implémentation de comportement à instance unique dans les applications WPF

Ce guide explique comment créer une application WPF qui ne permet qu'une seule instance d'exécuter simultanément. Ceci est réalisé en utilisant des mutex.

Comprendre les mutexes

Un mutex (exclusion mutuelle) est une primitive de synchronisation. Il garantit qu'un seul processus peut accéder à une ressource partagée à un moment donné. Dans WPF, nous tirons partis de mutex pour empêcher plusieurs instances d'application de s'exécuter simultanément.

Détails d'implémentation

en utilisant des mutexes nommés:

La méthode préférée consiste à créer un mutex nommé dans le point d'entrée principal de votre application:

<code class="language-csharp">static class Program
{
    static Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
    // ...
}</code>

Les mutex nommés permettent la synchronisation sur plusieurs processus et threads.

Acquérir le mutex:

Pour déterminer si une autre instance est déjà en cours d'exécution, nous utilisons la méthode WaitOne:

<code class="language-csharp">if (mutex.WaitOne(TimeSpan.Zero, true))
{
    // Mutex acquired; application can start
    Application.Run(new MainWindow());
    mutex.ReleaseMutex();
}
else
{
    // Mutex unavailable; another instance is active
    MessageBox.Show("An instance is already running.");
}</code>

Facultatif: notification de l'instance existante:

Pour une expérience utilisateur améliorée, vous pouvez informer l'instance en cours d'exécution lorsqu'un nouveau lancement est tenté. Cela se fait en utilisant PostMessage:

<code class="language-csharp">if (!mutex.WaitOne(TimeSpan.Zero, true))
{
    NativeMethods.PostMessage(
        (IntPtr)NativeMethods.HWND_BROADCAST,
        NativeMethods.WM_SHOWME,
        IntPtr.Zero,
        IntPtr.Zero);
}</code>

Gestion du message Win32 personnalisé:

Dans votre fenêtre principale, remplacez WndProc pour écouter le message personnalisé et apporter la fenêtre existante au premier plan:

<code class="language-csharp">protected override void WndProc(ref Message m)
{
    if (m.Msg == NativeMethods.WM_SHOWME)
    {
        Activate(); // Bring to front
    }
    base.WndProc(ref m);
}</code>

Cette approche complète garantit une application WPF à instance unique robuste, empêchant plusieurs instances de s'exécuter simultanément. N'oubliez pas d'inclure les définitions NativeMethods nécessaires (non montrées ici pour la concision).

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn