Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Problem mit Prozess / doppelten Instanzen
Crox
myCSharp.de - Member



Dabei seit:
Beiträge: 31

Themenstarter:

Problem mit Prozess / doppelten Instanzen

beantworten | zitieren | melden

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();
				
			
		}
private Nachricht | Beiträge des Benutzers
Pulpapex
myCSharp.de - Member



Dabei seit:
Beiträge: 939
Herkunft: Rostock

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Crox
myCSharp.de - Member



Dabei seit:
Beiträge: 31

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Crox
myCSharp.de - Member



Dabei seit:
Beiträge: 31

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

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....
private Nachricht | Beiträge des Benutzers
Crox
myCSharp.de - Member



Dabei seit:
Beiträge: 31

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Crox
myCSharp.de - Member



Dabei seit:
Beiträge: 31

Themenstarter:

beantworten | zitieren | melden

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

Gruss,
Crox
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

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!”
private Nachricht | Beiträge des Benutzers
Crox
myCSharp.de - Member



Dabei seit:
Beiträge: 31

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Crox,

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

herbivore
private Nachricht | Beiträge des Benutzers