C# Prüfen ob ein Programm läuft

getotischer

Newbie
Registriert
Apr. 2010
Beiträge
2
Hallo zusammen,

ich hoffe ich bin für euch nicht nur ein weiterer Anfänger der zu faul ist die Suche zu benutzen, aber ich habe gesucht und ich komme einfach nichtmehr weiter.... Ich bin wie gesagt ein blutjunger Anfänger und habe mir folgendes Zwischenziel gesetzt:
Ich möchte mit einem WPF-Projekt 4 Buttons in einem Fenster haben, welche 4 verschiedene Programme starten(z.B. Outlook, Winamp, usw...). Soweit kein Problem, nun möchte ich aber, dass der Button disabled wird sobald das Programm dann auch tatsäclich läuft. Hierfür wollte ich folgende Funktion verwenden:

private bool CheckIfAProcessIsRunning(string processname)
{
return Process.GetProcessesByName(processname).Length > 0;
}

doch wie geht es nun weiter?? ich muss ja den string noch mit dem Prozessnamen deklarieren und wie komme ich an das boolsche Ergbniss der Prüfung ran? Ausserdem möchte ich das der Button automatisch wieder enabled wird wenn das durch den Button gestartete Programm beendet ist.
Ich wäre über eure Hilfe sehr dankbar, denn ich weiss nichtmehr was ich noch alles versuchen soll.
 
zum periodischen abfragen ist am besten ein timer (alle 5sekunden oder sowas) geeignet.
wie du einen machst (incl. delegates etc.) kannste googlen :)

dein anderes problem versteh ich allerdings nicht?
deine funktion tut doch schon alles was du möchtest...
 
danke für die schnelle Antwort,
ok die Funktion funktionert als schon, aber was mir nicht gant klar ist, wann und wo muss ich den string processname deklarieren und wie werte ich das Ganze jetzt aus, wenn ich z.B. bei positiver Prüfung einen Text ausgeben möchte.
könntest du mir evtl. mal ein Beispiel geben?
danke schonmal und sorry für meine "unwissenheit"
 
den string processname deklarierst du einfach bei aufrufen der funktion

d.h.:
Code:
private bool CheckIfAProcessIsRunning(string processname)
{
return Process.GetProcessesByName(processname).Length > 0; 
}

private void Main()
{
bool outlook_running = CheckIfAProcessIsRunning("outlook");
if(outlook_running==true)
      Console.WriteLine("Outlook läuft.");
}


wobei ich nicht weiß, ob das jetzt der richtige string wäre
 
Wenn du über die Process-Klasse gehst dann ist es unnötig evtl. fehlerhaft die Process.GetProcessesByName Methode zu verwenden um zu prüfen ob der Prozess vorhanden ist oder nicht, besser wäre dann in Zeitintervallen zu prüfen ob die Eigenschaft HasExited auf True steht, z.B.:

Code:
System.Diagnostics.Process procOutlook = System.Diagnostics.Process.Start("outlook.exe");
pbOutlook.Enabled = false;
while(!procOutlook.HasExited)
  System.Threading.Thread.Sleep(500);
pbOutlook.Enabled = true;

Der obige Code hat den Nachteil das die Anwendung blockiert ist, solange Outlook ausgeführt wird. Besser wäre procOutlook als eine Klassenvariable zu definieren und dann mit einem Timer zu arbeiten, der Zugriff auf die Variable hat.

@BloodHunter2k8:
Ein simples "Ja" hätte auch gereicht ;)
 
bei
System.Diagnostics.Process procOutlook = System.Diagnostics.Process.Start("outlook.exe");
hat man das problem, dass die anwendung ja bereits über das start menü gestartet worden sein hätte können (:D)
 
@BloodHunter: auch schon mal daran gedacht das das ein Feature sein könnte und kein Problem? :D
 
@bloodhunter
wo ist das Problem wenn die anwendung schon läuft. dann prüfst du halt ob die läuft oder nicht! hab alles durchgelesen aber ich verstehe immer noch nicht wo das problem bei euch liegt
 
ja eben! es soll ja geprüft werden, und mit

System.Diagnostics.Process procOutlook = System.Diagnostics.Process.Start("outlook.exe");
pbOutlook.Enabled = false;
while(!procOutlook.HasExited)
System.Threading.Thread.Sleep(500);
pbOutlook.Enabled = true;

muss man doppelt prüfen ;)
aber auch egal, TE ist anscheinend schon wieder inaktiv
 
wieso doppelt? da wird nur einmal geprüft.
aber warte... was verursacht genau hasexited? ich habe jetzt nicht nachgeschaut aber ich kann mir vorstellen dass es intern nochmal prüft ob die anwenung läuft. wenn es so ist, dann ist der zweck der sach ja schon erfüllt, d.h. nach 500 ms wird jedes mal geschaut ob die anwengung mit dem namen x noch nicht beendet hat.
 
Es geht aber nur um den Fall, das bei der Prüfung über HasExited tatsächlich nur der Prozess/die Instanz ausgewertet wird, welche man auch über seine eigene Anwendung gestartet hat. Bloodhunter packt aber den ganz großen Hammer aus und will das doppelte Starten über die eigene Anwendung und Startmenü unterbinden, was aber für mich recht wenig Sinn macht, da ich jederzeit über das Startmenü mehrere Instanzen einer Anwendung starten kann. Andererseits kann ich dann nicht über meine Anwendung die Instanz starten, wenn ein gleich benannter Prozess im Hintergrund werkelt, vielleicht ist der ja auch noch unsichtbar und ich müßte den erst über den Taskmanager/Prozesse beenden. Aber wie dem auch sei, ist halt der Geschmack des Monats. Der TE kann ja selbst entscheiden, was und wie er es machen will...

@Bloodhunter: Sieh es nicht so eng, es gibt viele Wege, die nach Rom führen (Die Erde ist rund). Habe nur meinen Senf dazu gegeben, das man etwas auch anders machen kann. War keinerlei persönlicher Angriff dahinter, sondern viel mehr nur ein Gedankenaustausch...
 
Zuletzt bearbeitet:
Rossibaer schrieb:
Sieh es nicht so eng, es gibt viele Wege, die nach Rom führen (Die Erde ist rund). Habe nur meinen Senf dazu gegeben, das man etwas auch anders machen kann. War keinerlei persönlicher Angriff dahinter, sondern viel mehr nur ein Gedankenaustausch...
Dito :)
Wollte halt nur aufzeigen das es relativ unsinnig ist Outlook mehrmals zu starten.
Jetzt kann der TE halt wählen was er braucht :P
 
Zurück
Oben