Entwickler-Ecke

WinForms - Button, Listbox und Prozesse


deada - Fr 23.07.10 10:33
Titel: Button, Listbox und Prozesse
Hallo lebe C# Member,

ich habe ein kleines (hoffe ich) Problem.

Ich habe einen Directory chooser der mir ein pfad übergibt. In diesem pfad scanne ich nach den ordner namen.
Die Ordner Namen werden dann in eine Listbox aufgelistet.

Ich habe dann noch zwei Buttons.
1. Start Button
Wenn ich dadrauf klicke sucht er nach eine exe in diesem Ordner und startet Sie anschliesend

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
      //Pfad der Ordner
            string path1 = CurrLoc.Text;
            string bslash = "\\";
            string path2 = CharList.SelectedItem.ToString();
            string fullpath = path1 + bslash + path2;

            MessageBox.Show(fullpath);

            string[] exepath = Directory.GetFiles(fullpath, "*.exe");

            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(exepath[0]);

            System.Diagnostics.Process.Start(startInfo);

2. Kill Button
Und da ist das problem. Ich weiss einfach nicht wie ich das hinbekommen soll den Prozess zu beenden. ProzessID, ProzessName keine Ahnung.
Da ich ja auch mehrere Starten werde(Aus verschiedenen Ordner) muss ich i-wie den Prozess zurückverfolgen.

In Java hab ich es hinbekomm und dort hab ich es mit einer for schleife, Prozess und ne HashTable gemacht.
Ich bin noch neu in C# und brauch deswegen eure hilfe!

LG,

deada


Ralf Jansen - Fr 23.07.10 12:02

Der Aufruf von Process.Start liefert dir eine Process Instanz zurück die du dir einfach nur merken musst. Auf dieser Instanz kannst du die Kill() Methode aufrufen um den Prozess wieder zu beenden.


danielf - Fr 23.07.10 12:03

Hi,

ja Java ist an dieser Stelle nicht so geschickt wie .NET ;) Allerdings muss man trotzdem wissen wie es geht.

Wenn du in MSDN schaust (ich google immer nach dem Schlagwort und dann "msdn .net c#" dran). Gelangt man zur MSDN [http://msdn.microsoft.com/en-us/library/system.diagnostics.process.start(VS.71).aspx]-Seite die die sagt, dass die Prozedur ein Prozess Instanz zurück gibt.

Gehst du auf die Methoden der Prozess Klasse findest du die Methode Kill
Zitat:
Kill Hält den zugeordneten Prozess sofort an.


Viel Spaß damit & Gruß


deada - Fr 23.07.10 13:15

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Der Aufruf von Process.Start liefert dir eine Process Instanz zurück die du dir einfach nur merken musst. Auf dieser Instanz kannst du die Kill() Methode aufrufen um den Prozess wieder zu beenden.


Wie kann ich es den implementieren?

Die Methoden kannte ich, nur wusste ich nicht wie ich sie anwende.

könntest du vllt anhand meines quelltextes was anschreiben, dass ich ein denkstupser bekomme?

lg,

deada


Ralf Jansen - Fr 23.07.10 13:28


C#-Quelltext
1:
2:
System.Diagnostics.Process meinLieberProcess = System.Diagnostics.Process.Start(startInfo);
meinLieberProcess.Kill();


deada - Fr 23.07.10 13:39

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
1:
2:
System.Diagnostics.Process meinLieberProcess = System.Diagnostics.Process.Start(startInfo);
meinLieberProcess.Kill();


Vielen Dank das klappt nun =)

Ich hätt jetzt aber ein weiteres problem:

z.B:

1. starte programm a
2. starte programm b
3. beende durch auswahl in der ListBox programm a, es wird aber programm b beendet.

Wie kann ich das lösen?


norman2306 - Fr 23.07.10 13:55

Da hast du wohl nur eine Prozessvariable deklariert, um beide Prozesse zu laden. Und b befindet sich als zu letzt gestarteter Prozess natürlich in der Variable.


besy - Fr 23.07.10 15:07

Ginge dann nicht:


C#-Quelltext
1:
2:
Process myProcess = Process.GetCurrentProcess();
myProcess.Kill();


Zumindest unter der Annahme das den Prozess den du auswählst zu beenden der gerade aktive ist.


Th69 - Fr 23.07.10 15:22

Sich selbst abschießen - super! -)


besy - Fr 23.07.10 15:28

Deswegen sagte ich ja, unter der Vorraussetzung das der Prozess der weg soll der gerade aktive ist.


Ralf Jansen - Fr 23.07.10 15:29

Zitat:
Wie kann ich das lösen?


Schreibe dir eine Klasse zum Verwalten des Anzeigetextes und eines Prozesses.Z.B.


C#-Quelltext
1:
2:
3:
4:
5:
    public class MyProcess
    {
        public string DisplayString { get; set; }
        public Process Process { get; set; }    
    }


Leg dir eine Liste zur Verwaltung entsprechender Instanzen an.


C#-Quelltext
1:
    private BindingList<MyProcess> myProcesses = new BindingList<MyProcess>();                    


und binde die an deine Listbox


C#-Quelltext
1:
2:
   listBox1.DataSource = myProcesses;
    listBox1.DisplayMember = "DisplayString";


wenn du einen Process startest lege in in dieser Liste an.Z.B.


C#-Quelltext
1:
myProcesses.Add(new MyProcess() { DisplayString = "notepad", Process = Process.Start("notepad.exe")});                    


Zum ~töten~ der Auswahl in der Listbox hol dir das SelectedItem, caste auf unsere Klasse und rufe kill auf.


C#-Quelltext
1:
2:
3:
    MyProcess myProcess = listBox1.SelectedItem as MyProcess;
    if ((myProcess != null) && (!myProcess.Process.HasExited))
        myProcess.Process.Kill();


Necaremus - Fr 23.07.10 16:04

ich hätt's prinzipiell genau so wie derjenige über mir gemacht, nur mit einem TreeView und die Processe an die .Tag eigenschaft der nodes gehängt.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
void MyAdd(Process proc)
{
 TreeNode n = new TreeNode(proc.Name);
 n.Tag = proc;
 myTreeView.Nodes.Add(n);
}
void MyKill()
{
 Process proc = (Process)myTreeView.SelectedNode.Tag;
 proc.Kill();
}


Nicht ganz so umständlich, finde ich ;)
(sofern es funktioniert[bin selber relativ neu beim proggen], müsste aber klappen, da du an der Tag eigenschaft prinzipiel alles dran hängen kannst)

so far


Ralf Jansen - Fr 23.07.10 16:11

Zitat:
hätt's prinzipiell genau so wie derjenige über mir gemacht,


Du kannst auch gerne Ralf zu mir sagen ;)


Necaremus - Fr 23.07.10 16:16

... ich hätt's prinzipiell wie Ralf gemacht. ;)


deada - Fr 23.07.10 17:57

user profile iconNecaremus hat folgendes geschrieben Zum zitierten Posting springen:
ich hätt's prinzipiell genau so wie derjenige über mir gemacht, nur mit einem TreeView und die Processe an die .Tag eigenschaft der nodes gehängt.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
void MyAdd(Process proc)
{
 TreeNode n = new TreeNode(proc.Name);
 n.Tag = proc;
 myTreeView.Nodes.Add(n);
}
void MyKill()
{
 Process proc = (Process)myTreeView.SelectedNode.Tag;
 proc.Kill();
}


Nicht ganz so umständlich, finde ich ;)
(sofern es funktioniert[bin selber relativ neu beim proggen], müsste aber klappen, da du an der Tag eigenschaft prinzipiel alles dran hängen kannst)

so far


Was für eine funktion haben die nodes?

Gibt ees den keine möglichkeit es wie in Java zu lösen?

Die listitems einen bestimmtem prozess zuzuordnen? Unter Java ging es mit einer Hashtable, gibt sowas bei C# und wäre das eine lösung?

ich find richtig nett das soviele sich melden.. =)


Th69 - Fr 23.07.10 18:33

Ralf Jansen hat dir doch schon geschrieben wie man es in C# richtig macht...


deada - Mo 26.07.10 08:27

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Ralf Jansen hat dir doch schon geschrieben wie man es in C# richtig macht...


Danke für die vielen antworten. Ich werde mich mal heute dran setzen..