Heim >Backend-Entwicklung >C++ >Wie kann ich sicherstellen, dass nur eine Instanz einer WPF -Anwendung gleichzeitig ausgeführt wird?

Wie kann ich sicherstellen, dass nur eine Instanz einer WPF -Anwendung gleichzeitig ausgeführt wird?

Patricia Arquette
Patricia ArquetteOriginal
2025-02-02 07:31:09452Durchsuche

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

Implementierung von Einzelinstanzverhalten in WPF-Anwendungen

In diesem Handbuch wird erläutert, wie eine WPF -Anwendung erstellt wird, mit der nur eine Instanz gleichzeitig ausgeführt wird. Dies wird unter Verwendung von Mutexes erreicht.

Verständnis von Mutexes

a mutex (gegenseitiger Ausschluss) ist eine Synchronisationsprimitive. Es stellt sicher, dass nur ein einzelner Prozess zu einem bestimmten Zeitpunkt auf eine gemeinsame Ressource zugreifen kann. In WPF nutzen wir Mutexes, um zu verhindern, dass mehrere Anwendungsinstanzen gleichzeitig ausgeführt werden.

Implementierungsdetails

Verwenden Sie namens Mutexes:

Die bevorzugte Methode beinhaltet das Erstellen eines benannten Mutex in den Haupteintrittspunkt Ihrer Anwendung:

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

Namens Mutexes ermöglichen die Synchronisation über mehrere Prozesse und Threads hinweg.

Erfassen Sie den Mutex:

Um festzustellen, ob eine andere Instanz bereits ausgeführt wird, verwenden wir die WaitOne -Methode:

<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>

Optional: Benachrichtigen Sie die vorhandene Instanz:

Für erweiterte Benutzererfahrung können Sie die laufende Instanz benachrichtigen, wenn ein neuer Start versucht wird. Dies geschieht mit 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>

Umgang mit der benutzerdefinierten Win32 -Nachricht:

In Ihrem Hauptfenster überschreiben WndProc, um die benutzerdefinierte Nachricht zu hören und das vorhandene Fenster in den Vordergrund zu bringen:

<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>

Dieser umfassende Ansatz gewährleistet eine robuste WPF-Anwendung mit einer einzigen Instanz, wodurch mehrere Instanzen gleichzeitig ausgeführt werden. Denken Sie daran, die erforderlichen NativeMethods Definitionen einzuschließen (hier nicht für Kürze).

Das obige ist der detaillierte Inhalt vonWie kann ich sicherstellen, dass nur eine Instanz einer WPF -Anwendung gleichzeitig ausgeführt wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn