2009-08-21 4 views
0

Ok, je crée une application vb.net winforms très basique, essentiellement vous pouvez y faire glisser des fichiers, et ensuite utiliser un fichier batch pour traiter les fichiers.Utilisation de l'événement Exited dans vb.net

C'est très simple et tout est prévu jusqu'à présent, il accepte les bons fichiers, il utilise le fichier batch pour les traiter et le fichier de commandes fait ce qu'il est censé faire.

Le seul problème est que je ne sais pas comment accrocher dans l'événement Exited qui peut/devrait être soulevée par le processus de fichier batch lorsque le processus se termine ...

Je veux la fenêtre DOS du fichier batch pour rester caché pendant qu'il est en cours d'exécution, donc j'ai utilisé ProcessStartInfo pour spécifier le fichier batch, puis définissez la propriété WindowStyle du processus à ProcessWindowStyle.Minimised, puis utilisé System.Diagnostics.Process.Start(myBatch) pour démarrer le processus au moment approprié.

C'est très bien, ça marche et fait ce que je veux. Toutefois, la seule façon de savoir quand un processus se termine est d'utiliser l'événement Exited. Mais l'événement Exited ne fonctionne apparemment qu'avec un Process et non un ProcessStartInfo. Je pourrais passer à utiliser Process à la place, mais alors je ne pouvais pas (AFAIK) exécuter la fenêtre DOS minimisé ...

Y at-il un moyen de contourner cela? Je n'ai écrit que .net pendant quelques jours. Voici comment je cours le fichier de commandes:

Dim myBatch As New ProcessStartInfo("C:\\batchFiles\\test.bat") 

myBatch.WindowStyle = ProcessWindowStyle.Minimized 
system.Diagnostics.Process.Start(myBatch) 

Des idées?

Merci

Répondre

2

Essayez de créer un objet de processus et définir la propriété StartInfo. Vous pouvez ensuite appeler WaitForExit au lieu d'attendre l'événement. EG:

using(var process = new Process 
            { 
             StartInfo = 
              new ProcessStartInfo("Foo.exe") 
              {WindowStyle = ProcessWindowStyle.Minimized} 
            }) 
      { 
       process.Start(); 
       process.WaitForExit(); 
      } 
+0

: D Je utilisé le code suivant à la fin de obtenir pour faire ce que je veux: Dim proc Nouveau process proc.StartInfo.FileName = "C: \\ myBat.bat" proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden proc.StartInfo.CreateNoWindow = True proc.Start() proc.WaitForExit() proc.Fermer() – danwellman

0

Pas sûr de la syntaxe en VB, mais je suis presque sûr que ce que vous avez à faire est d'utiliser effectivement la ligne API WIN avec code managé, et vous pouvez utiliser la MainWindowHandle de l'objet de processus.

[DllImport("User32")] 
     private static extern int ShowWindow(int hwnd, int nCmdShow); 

Les commandes qu'il prend, je recommanderais la référence à la bibliothèque win api pour cette méthode. Mais ce que vous voulez faire, je pense que c'est très faisable avec l'interop.

Andrew

+0

Je ne sais pas assez pour traduire à VB, mais merci pour la réponse :) Merci – danwellman

0

De l'documentation: Cet événement peut se produire que si la valeur de la propriété EnableRaisingEvents est vrai.

donc ce qui suit devrait fonctionner:

Dim procStart As New ProcessStartInfo 
Dim WithEvents proc As New Process 

Private Sub Button21_Click(sender As System.Object, e As System.EventArgs) Handles Button21.Click 
     procStart.FileName = "C:\PTL\Bin\xxxxxx.exe" 
     proc.StartInfo = procStart 
     proc.EnableRaisingEvents = True 
     proc.Start() 
End Sub 

Private Sub proc_Exited(sender As Object, e As System.EventArgs) Handles proc.Exited 
    Debug.WriteLine("Process Ended " + proc.ExitCode.ToString + " " + DateTime.Now.ToString) 
End Sub