Laden...

Single Instance Application mit WPF und C#

Erstellt von KPhoenix vor 9 Jahren Letzter Beitrag vor 9 Jahren 5.460 Views
K
KPhoenix Themenstarter:in
175 Beiträge seit 2011
vor 9 Jahren
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

T
314 Beiträge seit 2013
vor 9 Jahren

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

W
113 Beiträge seit 2006
vor 9 Jahren

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

199 Beiträge seit 2006
vor 9 Jahren

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.

R
100 Beiträge seit 2009
vor 9 Jahren

@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);
		}
	}
}

K
KPhoenix Themenstarter:in
175 Beiträge seit 2011
vor 9 Jahren

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

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