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."
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.
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."
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();
}
}
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!!!
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(); )
> Codejunky <
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
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(
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 🙂
Hallo Andreas.May,
Klappt super mit Mutex.
Danke!!