Autor Beitrag
chip777
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Fr 16.04.10 14:55 
Hi,

ich würde gerne eine Datei mit dem dazugehörigen Prozess öffnen, dass funktioniert mit folgendem Code auch super:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.EnableRaisingEvents = false;
            process.StartInfo.FileName = (fullPathname);
            process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
            process.Start();


Danach führe ich einen Methodenaufruf auf.

ausblenden C#-Quelltext
1:
            oeffne_BFW(fullPathname);					


Jetzt würde ich den betreffenden Excel Prozess gerne wieder schließen, leider hab ich es bis jetzt nur hinbekommen, alle excel Prozesse zu schließen, das sieht dann so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
            Process[] pp = Process.GetProcessesByName("excel");
            foreach (Process p in pp)
            {
                p.CloseMainWindow();    // Normales ende
                //p.Kill();               //sofort beenden
            }


Wie kann ich die Prozess ID speichern und dann später über diese den Prozess beenden? Oder gibt es noch eine ganz andere Möglichkeit?


Moderiert von user profile iconKha: Topic aus WinForms verschoben am Fr 16.04.2010 um 16:38
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Fr 16.04.10 15:12 
Hallo,

du musst dir das Erzeugte Process-Objekt merken.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
Process myExcelProcess = oeffne_BFW(fullPathname);

// do something

myExcelProcess.CloseMainWindow();


wobei
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public System.Diagnostics.Process oeffne_BFW(string path)
{
  System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.EnableRaisingEvents = false;
            process.StartInfo.FileName = path;
            process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
            process.Start();
    return process;
}
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Fr 16.04.10 15:16 
Ich schätze mal, du definierst den Process erst in der Funktion? Definiere den Process als Klassenvariable, dann kannst du von überall zugreifen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public class MyApp
{
   Process process = null;

   private void StartProc(string fullPathname)
   {
       process = new Process();
       process.EnableRaisingEvents = false;            
       process.StartInfo.FileName = (fullPathname);            
       process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;            
       process.Start();
   }

   private void StopProc()
   {
      if(process != null)
         p.CloseMainWindow(); 
   }
}
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Fr 16.04.10 15:48 
Das ist nicht so geschickt. Stell dir vor jemand ruft zweimal die StartProc-Methode auf. Schon verlierst du die Referenz auf das erste Objekt. Dann müsstest du also überprüfen ob der Prozess schon läuft und wieder Fehlerhandling einbauen... usw. Man sollte immer die notwendigen Parameter an eine Funktion übergeben und erstellte Objekte, wenn sie nach Ablauf der Methode noch benötigt werden zurück geben.
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Fr 16.04.10 15:52 
Jop, du hast recht. Schnellschuss:)
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 19.04.10 07:31 
Hi,

ich hab Daniels Idee mal versucht umzusetzen. Ich muss glaub ich aber mal noch was erklären, also das

ausblenden C#-Quelltext
1:
oeffne_BFW(fullPathname);					


Ist eine eigene Methode, die nichts mit dem Excel Prozess zu tun hat, die braucht einfach nur die Variable fullPathname und diese lädt dann ein Excel File in ein DataGridView.

Und deshalb klappt das mit dem Prozess schließen nicht so ganz wie du es bis jetzt beschrieben hast.

Vielleicht gibt es ja einfach eine Möglichkeit beim Starten des Prozesses, dessen ID auszulesen und den Prozess dann über die ID zu killen.
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 19.04.10 07:55 
Ich hab jetzt folgende Zeilen eingebaut:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
string id = System.Diagnostics.Process.GetProcessesByName("excel")[0].Id.ToString();
...
oeffne_BFW(fullPathname);
...
int test = Convert.ToInt32(id); //Diese Zeile hab ich mit per Edit eingefügt.
Process[] pp = Process.GetProcessById(id);
            foreach (Process p in pp)
            {
                p.CloseMainWindow();      // Normales ende
                p.Kill();               //sofort beenden
            }


Allerdings gibt der Compiler mir eine Fehlermeldung aus, Eine implizite Konvertierung vom Typ "System.Diagnostics.Process" in "System.Diagnostics.Process[]" ist nicht möglich..."
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 19.04.10 08:43 
Das liegt daran, das eine ID eindeutig ist und die Funktion deshalb ein Process-Objekt zurück gibt. Anders als die Klasse GetProcessesByName welche du zuvor verwendet hast. Einen Namen gibt es mehrere.

Dein Code macht so aber wieder überhaupt keinen Sinn.. mal überlegt was er macht? und was du machen willst?

Versuch mit Kommentaren klar zu machen, was du da machst. Dabei meine ich nicht Kommentare wie:
ausblenden C#-Quelltext
1:
2:
// casten des Strings id zu int und speichere den Wert in der integer Variable test
int test = Convert.ToInt32(id);

Sondern strukturierte Kommentare in der Form:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// 1) Erstelle Excel Prozess
Process myExcelProcess = oeffne_BFW(fullPathname);

// 2) mach irgendwas
// do something

// 3) Beende Excel Prozess
myExcelProcess.CloseMainWindow();


Also du solltest dir schon die Mühe machen, den Code zu verstehen. Den das was ich dir bereits hingeschrieben habe hat nichts mit dem zu tun was du wieder umgesetzt hast :/
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 19.04.10 09:39 
Im Moment reden wir leider etwas aneinander vorbei. Ich kann deinen Code nicht verwenden, weil er so nicht funktioniert. Das liegt aber an mir, weil ich mich nicht richtig ausgedrückt habe.

das
ausblenden C#-Quelltext
1:
oeffne_BFW(fullPathname)					

ist eine Methode die wie oben beschrieben ein DataGridView in eine Datei speichert. Das hat aber nichts mit dem Excel Prozess an sich zu tun.

das wäre also der //do something Teil meines Programmes.

Deshalb habe ich deinen Code nicht verwendet, ich habe zwar versucht ihn so anzupassen, dass es klappt, aber das bekomm ich leider nicht hin.

Ich weiß das das was ich geschrieben habe, nichts mit deiner Idee zu tun hatte, dass hab ich nur geschrieben, weil ich mit deiner Idee nicht zurecht gekommen bin und dachte das ich mit meiner vielleicht weiter komme. Da dem nicht so ist, würde ich dich ncohmal bitten, deinen Code so umzustellen das ich ihn benutzen kann, also das oeffne_BFW ist der do something Teil, und den Prozess müsste ich dann quasi anders nennen.
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 19.04.10 09:46 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Process myExcelProcess = OpenExcel(fullPathname);

oeffne_BFW(fullPathname);

myExcelProcess.CloseMainWindow();


public System.Diagnostics.Process OpenExcel(string path)
{
   System.Diagnostics.Process process = new System.Diagnostics.Process();
   process.EnableRaisingEvents = false;
   process.StartInfo.FileName = path;
   process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
   process.Start();
   return process;
}