Laden...

MDI Form einmal starten / Programm nur einmal starten

Erstellt von Two_Hart vor 19 Jahren Letzter Beitrag vor 15 Jahren 8.960 Views
T
Two_Hart Themenstarter:in
4 Beiträge seit 2004
vor 19 Jahren
MDI Form einmal starten / Programm nur einmal starten

Hallo Ihr C# süchtigen 🙂!!!!

Ich habe wieder mal eine Frage!!

Und zwar, arbeite ich heute das erste mal mit einen MDI Form. So funkt. das schon aber meine Frage ist wie kann ich es underbinden das eine Formular zweimal gestartet wird?

Und noch eine Frage mal so generell weil es mir gerade so einfällt ich hatte letzte Woche mal das Problem das ein Programm nur einmal gestartet werden darf.

Okay damals in VB6 ging das relativ einfach aber wie funkt. das bei C#?

wäre schön mal was von euch zuhören!! Schon mal danke im vorraus!!!

Gruß Two_hart

"Ich hoffe immer noch, dass ich die Welt ein wenig besser verlasse, als ich sie vorgefunden habe."

N
4.644 Beiträge seit 2004
vor 19 Jahren

Zum Beispiel so:

MDIChild child;
private void mnuItemchild_Click(object sender, System.EventArgs e)
{
	if(child== null)
	{
		child= new MDIChild();
		child.MdiParent = this;
		child.Show();
		child.Closed +=new EventHandler(child_Closed);
	}
}

private void child_Closed(object sender, EventArgs e)
{
	child = null;
}

Der Code steht im MDIParent.

Mehrfachstart einer Anwendung kannst verhindern, indem Du Prozessnamen und Fenstertitel der laufenden Anwendungen vergleichst.

T
Two_Hart Themenstarter:in
4 Beiträge seit 2004
vor 19 Jahren

Danke erstmal mit den Mdi - Form hat so funkt.!!
War ja simbel, blöd das ich nicht selber darauf gekommen bin.

Hast du rein zufällig mal ein beispiel zum "Anwendung einmal Starten" - Problem

"Ich hoffe immer noch, dass ich die Welt ein wenig besser verlasse, als ich sie vorgefunden habe."

N
4.644 Beiträge seit 2004
vor 19 Jahren

Dieses Code Beispiel ist aus dem Buch: "Das C# Codebook".

public static Process RunningInstance()
{
	// Alle Prozesse mit dem Namen des aktuellen Prozesses holen
	System.Diagnostics.Process[] processes = Process.GetProcessesByName(	Process.GetCurrentProcess().ProcessName);
	// Alle Prozesse durchgehen und den Fenstertitel vergleichen
	string mainWindowTitle = Process.GetCurrentProcess().MainWindowTitle;
	for (int i = 0; i < processes.Length; i++)
	{
		// Den aktuellen Prozess ausschließen
		if (processes[i].Id != Process.GetCurrentProcess().Id)
		{
			if (processes[i].MainWindowTitle == mainWindowTitle)
			{
				// Prozess gefunden, diesen zurückgeben
				return processes[i];
			}
		}
	}
	// Kein Prozess gefunden, der dem aktuellen entspricht, also null
	// zurückgeben
	return null;
}
		

private void StartForm_Activated(object sender, System.EventArgs e)
{
	// Überprüfen, ob die Anwendung bereits ausgeführt wird.
	if (RunningInstance() != null)
	{
		// Die Anwendung wird bereits ausgeführt, also eine Meldung ausgeben
		// und die Anwendung beenden
		MessageBox.Show("Dieses Programm kann nicht mehrfach ausgeführt " +
					"werden.", Application.ProductName, MessageBoxButtons.OK,
		MessageBoxIcon.Exclamation);
		this.Close();
	}
}
V
28 Beiträge seit 2005
vor 17 Jahren

Original von Noodles
Zum Beispiel so:

MDIChild child;  
private void mnuItemchild_Click(object sender, System.EventArgs e)  
{  
  if(child== null)  
  {  
  	child= new MDIChild();  
  	child.MdiParent = this;  
  	child.Show();  
  	child.Closed +=new EventHandler(child_Closed);  
  }  
}  
  
private void child_Closed(object sender, EventArgs e)  
{  
  child = null;  
}  

Der Code steht im MDIParent.

Mehrfachstart einer Anwendung kannst verhindern, indem Du Prozessnamen und Fenstertitel der laufenden Anwendungen vergleichst.

Ich verstehe dieses Beispiel nicht !!! Bin zu doof!!!! 🙁

Baue nicht auf Ratschäge dummer Menschen. Du erkennst sie daran, dass sie in mehr als der Hälfte bei ihren Ratschlägen in der Vergangenheit unrecht hatten. Dr. Otto Buchegger

Was ich nicht leiden kann: "Ach, das ist ja einfach" ...alles ist einfach, wenn man weiß wie es geht! Ahhhh!!!

1.665 Beiträge seit 2006
vor 17 Jahren

Falls das Child noch nicht vorhanden ist, wird es erstellt.
Ansonsten passiert rein gar nix, wobei ich das verfeinern würde. Wenn das Mdi bereits vorhanden ist, sollte es beim Klick in den Vordergrund geraten ( child.Activate(); )

J
37 Beiträge seit 2007
vor 15 Jahren

Hallo,
ich habe versucht mit Hilfe von Noddles Code zu verhindern, dass mein GUI ein zweites mal geöffnet wird, aber es funktioniert leider nicht.

Daher habe ich in meinen Code einige Ausgaben eingebaut um zu sehen wo es hakt. Und da habe ich bemerkt, dass der string mainWindowTitle leer ist: string mainWindowTitle = Process.GetCurrentProcess().MainWindowTitle;

Folgendes ist nun ganz komisch.

Ausgabe von "Process.GetCurrentProcess()" ist genau die gleiche wie von "processes_"

Aber: Ausgabe von "Process.GetCurrentProcess().MainWindowTitle" ist leer aber in der Ausgabe von "processes_.MainWindowTitle" steht genau der richtige Titel drin.

Ich kann mir einfach überhaupt nicht erklären, woran das liegen könnte. Hat da jemand eine mögliche Erklärung? Oder hat jemand eine Idee, wie es anders lösen könnte? Ich hatte gehofft, ich brauche nur eine Property der Form richtig zu setzten 😉 aber so einfach ist es ja scheinbar nicht.

Danke und viele Grüße

915 Beiträge seit 2006
vor 15 Jahren

Hrm, würde eher zu Mutex greifen als über Process das ganze zu lösen.

Siehe hierzu: mehrere Programminstanzen verhindern?

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

B
1 Beiträge seit 2008
vor 15 Jahren
(erledigt)

Verhindern von Mehrfachstarts war auch bei der Applikation, an der ich momentan noch sitze, ein Thema. Mutex war damals auch meine erste Wahl, im praktischen Einsatz hatte ich damit aber größere Probleme.

Kurze Fassung: Die Mehrfachstartverhinderung per Mutex ging nach dem Mond. D.h. auf meinem Entwicklungsrechner ging's problemlos, auf allen anderen Testrechnern wurde es völlig ignoriert. Konkret klappte die Verhinderung via Mutex nur, wenn die erste Instanz der Applikation über den Visual C# Debugger startete und erst die zweite über die kompilierte Executable. Code war identisch mit der Mutex-Lösung hier im Forum.

Wird sicherlich irgendwo an meinem Code gehakt haben, ich konnte nur ums Verrecken nicht herausfinden wo, das Abfangen von Mehrfachstarts über die Prüfung laufender Prozesse war mir dann für meine eigene Pfuscherei irgendwie zuverlässiger 😉

Wobei mich die Frage, warum es über Mutex nicht geklappt hat, immer noch brennend interessieren würde. Ich hab da wahrscheinlich so gut wie alles an Vorlagen ausprobiert, u.a. auch die Lösung aus dem dicken Visual c# 2005 Wälzer von Galileo. Denn modifiziert hatte ich am Code der Vorlagen nichts.

Das größere Problem für mich ist momentan aber eher, jetzt die Mehrfachstartverhinderung so zu verfeinern, daß die 2. Instanz des Programms, bevor sie sich terminiert, irgendwie das Hauptfenster der 1. Instanz in den Vordergrund bringt.

Konkret das Problem hier, daß es in der Applikation zwar ein Quasi-Hauptfenster gibt, dieses aber beim Start minimiert und versteckt wird, eine mehr oder weniger hingepfuschtes Tray-Icon-Programm quasi. Sprich, es gibt auch keinen Pointer auf das Fenster, d.h. weder über die WinAPI noch über die process.MainWindowHandle Sachen komme ich momentan an das Fenster ran.

Zwar hatte ich bei CodeProject jetzt einen Ansatz gefunden, aber der erscheint mir ein wenig arg aufwendig für ein eher zweit- oder gar drittrangiges Feature?

Nachtrag: Okay, mein Mutex-Problem hab ich grad selbst gelöst. Wenn man will, daß das Mutex auch von anderen Apps gefunden werden kann, sollte man es natürlich auch vor dem Garbage Collector bewahren (>_<) Naja, wenigstens eine offene Frage schonmal geklärt 🙂

Nachtrag 2: Das Problem mit dem Ansprechen eines "nicht zu findenden" Fensters ist jetzt auch beseitigt, mycsharp.de sei Dank 🙂

J
37 Beiträge seit 2007
vor 15 Jahren
(erledigt)

Hallo Andreas.May,
Klappt super mit Mutex.

Danke!!