Visual Basic If (Process).hasExited Hilfe

01/06/2015 15:03 Kira Mikami#1
Hey Freunde.

Ich brauche bei einem Code-Schnipsel Hilfe.
Ich möchte, dass Timer1 durchgehend Checkt, ob "Notepad" geschlossen wurde.
Ich möchte nicht wissen, ob der Process läuft, sondern nur ob der Process geschlossen wurde als das Programm schon lief. Dies möchte ich in eine If befehl einbauen:

Code:
If Not Process.GetProcessesByName("Notepad").HasExited Then
            Me.Close()
            Form2.Close()
            Form3.Close()
        End If
Entweder bin ich total blind oder diese Funktion ergibt keinen sinn. Ich weiß das nach "Process.GetProcessesByName("Notepad")" nicht direkt ".HadExited" stehen darf, aber wie mach ich es dann am geschicktesten?

MFG
01/06/2015 16:15 Kraizy​#2
GetProcessesByName liefert dir ein Array der Prozesse. Bevor du also auf HasExited zugreifst, musst du erst angeben, welchen Eintrag du aus diesem Array meinst. Zum Beispiel durch GetProcessesByName("Notepad")(0).HasExited.

Was du jedoch beachten solltest, wenn du das benutzt: du wirst sehr wahrscheinlich eine Exception bekommen, wenn kein Notepad Prozess läuft, da im Array keine Einträge vorhanden sein werden.

Kleines Beispiel:

PHP Code:
dim procs() as process

//button1
procs Process.GetProcessesByName("Notepad")

//button2
if procs.count 0 then
   
for each proc as process in procs 
      
if proc.hasexited then
         msgbox
("process with ID " proc.Id " has exited.")
      else
         
msgbox("process with ID " proc.Id " still running.")
      
end if
   
next
else
   
msgbox("no processes")
end if 
Als Test öffnest du nun einfach mal 3x den Notepad, drückst Button1. Danach schließt du einen Notepad, und guckst mal was dir Button2 sagt.

Ach und nochwas: HasExited solltest du lieber bei den Prozessen benutzen, die du selber in deinem Programm ausführst und in einer Variable speicherst, z.B.

PHP Code:
dim myproc as process process.start("Notepad")
//...
if myproc.hasexited then
//... 
01/06/2015 18:40 snow#3
#moved
01/06/2015 20:31 warfley#4
Du brauchst ein Integer Feld Count dann beim Start
Code:
Count = IntegerProcess.GetProcessesByName("Notepad")
und dann im Timer:
Code:
if IntegerProcess.GetProcessesByName("Notepad") < Count Then
  Rem Wurde Beendet
Else
  Count = IntegerProcess.GetProcessesByName("Notepad")
End If
01/08/2015 13:46 Kira Mikami#5
Quote:
Originally Posted by warfley View Post
Du brauchst ein Integer Feld Count dann beim Start
Code:
Count = IntegerProcess.GetProcessesByName("Notepad")
und dann im Timer:
Code:
if IntegerProcess.GetProcessesByName("Notepad") < Count Then
  Rem Wurde Beendet
Else
  Count = IntegerProcess.GetProcessesByName("Notepad")
End If
Danke für deine Hilfe, aber des klappt bei mir nicht. Ich bin noch nicht SEHR erfahren, ich wüsste nicht wo ich Count = IntegerProcess.GetProcessesByname("Notepad") einfügen müsste.

Quote:
Originally Posted by Kraizy​ View Post
GetProcessesByName liefert dir ein Array der Prozesse. Bevor du also auf HasExited zugreifst, musst du erst angeben, welchen Eintrag du aus diesem Array meinst. Zum Beispiel durch GetProcessesByName("Notepad")(0).HasExited.

Was du jedoch beachten solltest, wenn du das benutzt: du wirst sehr wahrscheinlich eine Exception bekommen, wenn kein Notepad Prozess läuft, da im Array keine Einträge vorhanden sein werden.

Kleines Beispiel:

PHP Code:
dim procs() as process

//button1
procs Process.GetProcessesByName("Notepad")

//button2
if procs.count 0 then
   
for each proc as process in procs 
      
if proc.hasexited then
         msgbox
("process with ID " proc.Id " has exited.")
      else
         
msgbox("process with ID " proc.Id " still running.")
      
end if
   
next
else
   
msgbox("no processes")
end if 
Als Test öffnest du nun einfach mal 3x den Notepad, drückst Button1. Danach schließt du einen Notepad, und guckst mal was dir Button2 sagt.

Ach und nochwas: HasExited solltest du lieber bei den Prozessen benutzen, die du selber in deinem Programm ausführst und in einer Variable speicherst, z.B.

PHP Code:
dim myproc as process process.start("Notepad")
//...
if myproc.hasexited then
//... 
Danke für deine wirklich gute Hilfe, jedoch versteh ich dies auch nicht ganz. Ich bräuchte einen Fertigen Code um das ganze besser nachvollziehen zu können.


PHP Code:
dim procs() as process

//button1
procs Process.GetProcessesByName("Notepad")

//button2
if procs.count 0 then
   
for each proc as process in procs 
      
if proc.hasexited then
         msgbox
("process with ID " proc.Id " has exited.")
      else
         
msgbox("process with ID " proc.Id " still running.")
      
end if
   
next
else
   
msgbox("no processes")
end if 
Der Code funktioniert einfach nicht. Es wird nur folgendes ausgeführt:
PHP Code:
msgbox("no processes"
Auch wenn der Prozess an ist, wird mir folgendes nicht angezeit:
PHP Code:
msgbox("process with ID " proc.Id " still running."
und wenn ich es beende wird mir auch nicht folgendes angezeigt:
PHP Code:
msgbox("process with ID " proc.Id " has exited."
Ich hoffe, du kannst mir da Privat weiterhelfen.
Skype: Schicke ich dir Privat.

Währe dir wirklich vielmals dankbar.
01/08/2015 17:23 teto#6
Die Methode funktioniert einwandfrei.

Du darfst einfach nur nicht den Code in einer Funktion aufrufen.

Ich meine damit du musst schauen ob Notepad offen ist (eventuell mit einem Timer der alle 5 Sekunden schaut ob Notepad offen ist, ist dies der Fall stoppst du den Timer, damit du das Array mit den Prozessen nicht wieder überschreibst, nur so kann später auch erkannt werden ob der Prozess geschlossen wurde. Und wenn der Prozess irgendwann "hasExited" True zurückgibt startest du den Timer wieder so das dein Programm wieder darauf wartet bis Notepad sich öffnet.

Wenn du nämlich den Code so wie oben in eine Funktion schreibst wird wegen diesem Code:
PHP Code:
Dim procs() As Process

procs 
Process.GetProcessesByName("Notepad"
Das Array immer neu gefüllt mit den aktuellen Prozessen und smit kannst du nie den Status hasExited erreichen, da zu der Zeit wo du die Funktion aufrufst das Array neu füllst und in diesem gibt es kein Prozess mehr von Notepad und somit fällst du immer in den "no processes" Fall geworfen.