Laden...

Problem mit Prozess / doppelten Instanzen

Erstellt von Crox vor 18 Jahren Letzter Beitrag vor 18 Jahren 5.379 Views
C
Crox Themenstarter:in
31 Beiträge seit 2005
vor 18 Jahren
Problem mit Prozess / doppelten Instanzen

Hi Leute,

ich habe eine Frage zum starten und behandeln von Prozessen.
Ich starte per Button einen Prozess, gebe mir das Handle und setze es in
den Vordergrund (Fokus).
Jetzt Sende ich Keys was auch alles super klappt.

Jedesmal wenn der Benutzer nun auf den Button klickt, wird jedesmal ein neues
Fenster und ein neuer Prozess gestartet.

Wie kann ich das verhindern und einfach das alte Fenster wieder aktiv setzten
und überprüfen ob der Prozess (ID) noch läuft.
Je nachdem ob er noch läuft soll es nur aktiv oder neu gestartet werden.
(Bitte kein GetProcessByName, es geht um den Internet Explorer und der is bestimmt
par mal offen mit irgendwas...)

Hier der Programmcode des Buttons:


void Button1Click(object sender, System.EventArgs e)
		{
				
				
			Process Webseite = new Process();
			//Webseite.StartInfo.FileName = "notepad.exe";
			Webseite.StartInfo.FileName = "iexplore.exe";
			Webseite.StartInfo.Arguments = "http://shp.intern.hessen.de/HZD.CitrixPortal.Site/Templates/maintemplate.aspx";
			Webseite.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
				
			Webseite.Start();
					
			Thread.Sleep(10000);
						
			//Webseite.Refresh();
			
			//SendKeys.Send("%{TAB}");
			//SendKeys.Send("%{TAB}");
			SetForegroundWindow(Webseite.MainWindowHandle);
			SendKeys.Send(Username.Text);
			SendKeys.Send("{TAB}");
			SendKeys.Send(Passwort.Text);
			SendKeys.Send("{TAB}");
			SendKeys.Send(Domain.Text);
			SendKeys.Send("{TAB}");
			SendKeys.Send("{TAB}");
			SendKeys.Send("{ENTER}");
			SendKeys.Send("{TAB}");
				
			//this.Hide();
				
			
		}

P
939 Beiträge seit 2003
vor 18 Jahren

Hi Crox,

du kannst den IE als Klasse importieren. Dann hast du Zugriff auf alle Eigenschaften und Methoden und kannst z.B. auch die Darstellung anpassen. Toolbar, Addressleiste, Statusleiste ein- und ausblenden und solche Sachen.

Einfach in der IDE einen COM-Verweis zum Projekt aus der Bibliothek %windows\system32\shdocvw.dll hinzufügen. Ausserhalb einer IDE funktioniert das mit dem Type-Library Importertool TlbImp.exe.

Siehe Thread: Prozess/InternetExplorer schliessen

Das Problem mit den doppelten Instanzen löst sich so von selbst, da du dann ein IE-Objekt hast und dort Visible = true/false, Activate usw. aufrufen kannst.

Gruss
Pulpapex

C
Crox Themenstarter:in
31 Beiträge seit 2005
vor 18 Jahren

Ja, nee, würde das schon gerne nur mit einem Prozess machen und nicht irgendwelchen
IE-Objekten...

Das muss ja auch gehen, wenn man nicht den Internet Explorer nimmt, sondern
ein Notepad oder Firefox...

4.221 Beiträge seit 2005
vor 18 Jahren

Process.Handle (resp. bei Dir Webseite.Handle) liefert ja den Handle auf den soeben gestarteten Process.

Process.Id (resp. bei Dir Webseite.Id) liefert die ProcessId als int.

Mit Process.GetProcessById(die vorher erhaltene Id) kriegst Du den Process wieder (oder auch nicht... wenn der Process tot ist)....

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

C
Crox Themenstarter:in
31 Beiträge seit 2005
vor 18 Jahren

Ok, und wie kann ich überprüfen ob der Prozess tot ist?
Wie baue ich die Überprüfung am besten in mein Programm ein?
Ich kann ja das Handle nicht als lokale variable speichern,
bei jedem Button aufruf geht sie mir ja verloren.

Globale Variable?

Danke schonmal.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Das Process.Objekt kennt einen Exited-Event. Hänge dich da ein und dein Programm wird benachrichtigt, wenn der Prozess gestorben ist. Beachte die Verzögerung des Aufrufes durch die Trauerfeier.... 😉

C
Crox Themenstarter:in
31 Beiträge seit 2005
vor 18 Jahren

Mhmm, ich bin noch nicht allzu versiert in die Sprache.
Manches was hier gefallen ist, sind für mich böhmische Dörfer 🙂

kann mir jemand mehr darüber erzählen oder meinen Code oben, dementsprechend verändern?

C
Crox Themenstarter:in
31 Beiträge seit 2005
vor 18 Jahren

Hi, wie siehts aus?
Es ist sehr wichtig für mich das ich das irgendwie hinbekomme.

Gruss,
Crox

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo Crox!

Also, das Objekt Webseite besitzt ein Event namens 'Exited', das wird gefeuert, sobald der Prozess "stirbt" (<- Das ist ja wie bei einer Massenhinrichtung 🙂

Dieses Event solltest Du abonieren, soll heißen, Du würdest gerne benachrichtet werden, sobald es eintrifft.

Das machst Du folgendermassen:


Process Webseite = new Process();
Webseite.StartInfo.FileName = "notepad.exe";
Webseite.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;

Webseite.Exited += new EventHandler(Webseite_Exited);

Dann musst Du innerhalb Deiner Klasse noch eine Methode definieren, die automatisch aufgerufen wird, sobald das Ereignis eintrifft:


private void Webseite_Exited(object sender, EventArgs e)
{
	// Hurrah ab hier ist der Prozesstotengräber erfolgreich gewesen,
	// und der Prozess 'Webseite' ist nun tot.
}

Das sollte zumindest fürs ausprobieren mal reichen, oder?

Viel Spaß damit,
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

C
Crox Themenstarter:in
31 Beiträge seit 2005
vor 18 Jahren

Hi, danke schön.
Dein Code Funktioniert soweit.
Nur wie kann ich mein klick auf einen Button prüfen ob das Event eingetreten ist?
Beim klick auf den Button, soll ja abgewägt werden ob das schon vorhandene
Fenster in den Vordergrund geschoben werden soll, oder der Prozess neugestartet werden soll.

Gruss,
Crox

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Crox,

nimm einfach eine boolsche Instanzvariable, die du in dem EventHandler auf true setzt.

herbivore