Laden...

Single Instance Application mit WPF und C#

Letzter Beitrag vor 10 Jahren 6 Posts 5.638 Views
Single Instance Application mit WPF und C#

Hallo zusammen
Ich habe eine C# WPF Anwendung und möchte, dass die Anwendung nur einmal gestartet werden kann. Ich hab im Internet schon Varianten mit Mutex und ProcessId gefunden. Aber alle führten dazu, dass die Anwendung einfach beendet wird (falls bereits gestartet). Ich möchte aber, dass beim 2. Starten einer Anwendung die bereits gestartete Anwendung den Focus erhält. Ist dies überhaupt möglich? Mit VB geht es scheinbar.

Vielen Dank
Stefan

Und das funktioniert nicht?how-to-set-focus-to-another-window

Hallo KPhoenix,

möglich ist dies auf jeden Fall.

Auf Anhieb fallen mir 2 Möglichkeiten ein:
-Du schickst der laufenden Anwendung eine Nachricht damit sich diese in den Vordergrund bringt
-Du suchst das Handle des Fensters der laufenden Anwendung und bringst dies in den Vordergrund

Um einen Win32 Aufruf kommst du meines Wissens nach nicht rum.

mfg,
XaN

Eine möglichkeit wäre, dass man das Fenster per HWND_BROADCAST in den Vordergrund holt.
Ich muss jetzt nur schauen, ob ich das aus dem Stegreif zusammenbekomme, weil ich aktuell kein Beispiel dazu zur Hand habe.

Man muss mit RegisterWindowMessage die Message WM_SHOWFIRSTINSTANCE|{0} anlegen

public static readonly int WM_SHOWFIRSTINSTANCE = WinApi.RegisterWindowMessage("WM_SHOWFIRSTINSTANCE|{0}", guid

Die Guid kommt dabei aus der AssemblyInfo.cs

[assembly: Guid("xxxx-xxxx-xxxx-xxxx-xxxx")]

Letztendlich kann man dann eine entsprechende Windows Message senden, um das Fenster in den Vordergrund zu holen:

WinApi.PostMessage((IntPtr)HWND_BROADCAST, WM_SHOWFIRSTINSTANCE, IntPtr.Zero, IntPtr.Zero);

Welchen Wert HWND_BROADCAST hat, weiß ich jetzt nicht auf Anhieb, aber das kann man sicherlich bei MSDN finden.

@KPhoenix:

Ich nutze gerade diesen Code um Single-Instance-App zu erstellen. Probier mal.
ShowWindow und SetForegroundWindow sind Windows API Funktionen mit PInvoke.


[STAThread]
private static void Main()
{
	bool isOwnMutex = false;
	Mutex mutex = new Mutex(true, "E6720F8F-316F-423C-B801-86035273D03A", out isOwnMutex);

	if (isOwnMutex)
	{
		try
		{
			//Start app
		}
		catch (Exception ex)
		{
			//Exception
		}
		finally
		{
			mutex.Close();
		}
	}
	else
	{
		foreach (Process p in Process.GetProcessesByName(Application.ProductName))
		{
			OSUtil.ShowWindow((int)p.MainWindowHandle, 1);
			OSUtil.SetForegroundWindow(p.MainWindowHandle);
		}
	}
}

Ich hab die Lösung gefunden
Single Instance WPF Application in .NET 3.x

Funktioniert genauso, wie ich es wollte. Vielen Dank euch 😃