Entwickler-Ecke

Sonstiges (.NET) - Prüfen ob ein Programm noch läuft


philipp-schoene - Mi 04.04.12 11:57
Titel: Prüfen ob ein Programm noch läuft
Ich möchte prüfen ob ein Programm noch läuft. Falls nicht möchte ich das (mit einem if) auswerten. Ich weiß aber nicht, wie ich an die laufen Programme komme und wie ich das dann ach einem bestimmten Programm absuche. Ich würde mich über Hilfe freuen. Falls noch Fragen sind (Ich weiß nicht, was ihr für Infos braucht) fragt bitte nach.


Moderiert von user profile iconTh69: Topic aus WinForms verschoben am Mi 04.04.2012 um 14:14


Ralf Jansen - Mi 04.04.12 12:09

Die Process [http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx] Klasse wird dir da weiterhelfen. Wenn du weißt wie das gesuchte Programm heißt dann benutz die GetProcessByName Methode. Ansonsten wenn du andere Kriterien hast die dein Programm identifizieren sieh dir die anderen GetProcess/GetProcessByXXX Überladungen an.


philipp-schoene - Mi 04.04.12 12:17

Danke für deine schnelle Antwort. Ich habe mit die Hilfe auf MSDS angesehen. Ich werde also ein Array zurückbekommen: Ich bin in Array noch nicht so fit. Wie kann ich dann dieses Array auswerten?


Ralf Jansen - Mi 04.04.12 12:37

Da du scheinbar nur Wissen willst ob der Prozess (oder Prozesse) läuft brauchst du nur die Anzahl der Objecte im Array auswerten. Arrays hab dafür eine Length Property.


philipp-schoene - Do 05.04.12 15:50

Vielen Dank!
Das funktioniert so, wie ich es bis hierher wollte.
Ich möchte nun eine Combobox mit den möglichen Prozessen füllen und anschliesend in die Aktion von Oben integrieren. Ich habe schon probiert. Aber ich bin mir zu Unsicher mit der Process-Methode und mit Arrays auch. Bisher habe ich (bitte nicht lachen) folgenden Code im Form-Load:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
Process[] Prozesse = Process.GetProcesses();
string[] Namen as Array;
foreach (string s[] in Prozesse)
{
    cmbProzesse.Items.Add(s['ProcessName']);
}
cmbProzesse.Items.Add(Prozesse[]['ProcessName']);


Ralf Jansen - Do 05.04.12 16:09

Ui. Da hast du schon eine Menge durcheinander geworfen.

Zitat:

C#-Quelltext
1:
string[] Namen as Array;                    


Das ist Syntax irgendwo zwischen C# und VB. Durch die [] hast du schon ausgedrückt das du ein Array möchtest. Du mußt es nicht mehr dranschreiben also lass das 'as Array' weg.

Zitat:

C#-Quelltext
1:
foreach (string s[] in Prozesse)                    


Prozesse ist ein Array von Prozess Objekten. Da können keine Strings draus werden und erst recht keine string Arrays. Wenn du über Prozesse iterierst kommen da also Process Objekte raus und nicht strings. Also


C#-Quelltext
1:
foreach (Process s in Prozesse)                    


Zitat:

C#-Quelltext
1:
cmbProzesse.Items.Add(s['ProcessName']);                    


'' gibt es nur bei Charactern. String Literale werden in c# mit "" begrenzt. Und Processname ist einfach eine Property die du direkt abfragen kannst. Also


C#-Quelltext
1:
cmbProzesse.Items.Add(s.ProcessName);                    


Zitat:

C#-Quelltext
1:
cmbProzesse.Items.Add(Prozesse[]['ProcessName']);                    


Und das :?: Keine Ahnung was du damit erreichen wolltest ist unnötig laß es einfach weg.

Bleibt von deinem Code einfach übrig


C#-Quelltext
1:
2:
3:
Process[] Prozesse = Process.GetProcesses();
foreach (Process s in Prozesse)
    cmbProzesse.Items.Add(s.ProcessName);


philipp-schoene - Do 05.04.12 16:57

Danke nochmal für deine Hilfe. Nun wollte ich das ausgewählte Element in mein

C#-Quelltext
1:
Process.GetProcessesByName("calc");                    

einfügen. Also testweise


C#-Quelltext
1:
lblTest.Text = cmbProzesse.SelectedText.ToString();                    

geschrieben. Leider bekomme ich nichts (die Auswahl der Combobox) in mein Label rein. Habe ich die falsche Eigenschaft gewählt? Dachte das wäre jetzt leicht, aber schon wieder Probleme...

Zweite Frage: Kann man alle doppelten Einträge im Array irgendwie rauswerfen? Vielleicht kann man auch eine Blacklist anlegen, was auch nicht in das Dropdown soll?


Ralf Jansen - Do 05.04.12 17:01

Zitat:
Habe ich die falsche Eigenschaft gewählt?


Ja. SelectedText wäre der markierte Text im Texteditor-Teil der Combobox. Wenn du den Text oder Teile des Text nicht markiert hast kommt logischerweise bei SelectedText nix. Nimm zum Beispiel einfach die Text Property anstatt SelectedText. ToString kannst du dir sparen das sind eh schon strings.


philipp-schoene - Do 05.04.12 17:55

Ich muss mich wieder bedanken. Funktioniert, wie gewollt.

Zitat:
Zweite Frage: Kann man alle doppelten Einträge im Array irgendwie rauswerfen? Vielleicht kann man auch eine Blacklist anlegen, was auch nicht in das Dropdown soll?


Da wären wir wieder bei den Arrayfunktionen... Kannst du mir da vielleicht noch weiterhelfen? Ergänzen kann ich (Da habe ich bei einem anderen Projekt aufgehört, weil ich nicht weiter kam) Wie kann ich 2 oder mehr Array zu einem zusammenfügen? Also aus Array1[0...12] und Array2[0...6] wird ArrayGesamt[0...19] Die Indizes dürfen neu vergeben werden, ich brauche nur die Werte in einem Array


Th69 - Fr 06.04.12 09:14

Hallo Philipp,

s. Array.Copy [http://msdn.microsoft.com/de-de/library/system.array.copy.aspx]. Dazu mußt du aber ein neues Array erstellen mit der Größe von Array1+Array2, da Arrays nach der Erzeugung nicht mehr vergrößert werden können. Alternativ daher nimm besser eine List<T> [http://msdn.microsoft.com/de-de/library/6sh2ey19.aspx]:

C#-Quelltext
1:
2:
3:
List<int> list = new List<int>();
list.AddRange(array1);
list.AddRange(array2);

da diese sich intern bei Bedarf selber vergrößert (Eigenschaft Count).

Bitte erstelle demnächst aber für jede Frage ein eigenes Thema!