je viens à vous car j'ai un petit problème qui m'empêche d'avancer dans mon programme depuis un moment...
Donc je vous l'expose même si je pense que ce problème a déjà été posé bien que je n'ai rien trouvé sur le net.
J'ai un exécutable en invite de commande qui me pose une série de questions au quelles je dois répondre du genre "il fait beau?" donc je réponds puis "il fait chaud?" et je réponds et ainsi de suite...
Maintenant j'aimerais grâce à VB 2008 répondre à ces questions en fonction de variable que l'utilisateur va rentrés. En somme il me faut un moyen pour communiquer avec l'invite de commande.
Par ailleurs, cet exécutable me sors une série de résultat que j'aimerais bien pour voir mettre dans une variable du code VB.
J'ai essayé avec process.start et autre standardInpout mais sans succès. Voilà le bout de code que j'ai déjà fait.
Private Sub test_()
Dim inputText As String
Dim numLines As Integer = 0
Dim psi As New ProcessStartInfo()
'psi.Arguments = "/C DIR *.*"
psi.FileName = "temps.EXE"
psi.RedirectStandardInput = True
' psi.StandardOutputEncoding = _
'Encoding.GetEncoding("ibm850")
psi.UseShellExecute = False
Dim p As Process = Process.Start(psi)
Dim myStreamWriter As StreamWriter = p.StandardInput
'Do
inputText = "oui"
' If inputText.Length > 0 Then
' numLines += 1
myStreamWriter.WriteLine(inputText)
'End If
'Loop While inputText.Length <> 0 ''
'p.WaitForExit()
' p.Close() ''
psi.RedirectStandardOutput = True
Using o As StreamReader = p.StandardOutput
While Not o.EndOfStream
Me.Label5.Text &= o.ReadLine & vbCrLf
End While
End Using
End Sub
Bonsoir,
Ton code ne peut pas fonctionner puisque tu n'a pas mis de Handler te permettant de détecter un eventuel message de sortie de ton exe.
Il faut utiliser AddHandler.
De plus tu n'a pas ordonné a ton application de commencer à lire les sorties de ton exe
avec la fonction BeginOutputReadLine()
Voici un exemple qui fonctionne :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
monProcess = New Process()
monProcess.StartInfo.FileName = Application.StartupPath & "\temps.exe"
monProcess.StartInfo.CreateNoWindow = True
monProcess.StartInfo.UseShellExecute = False
monProcess.StartInfo.RedirectStandardOutput = True
AddHandler monProcess.OutputDataReceived, AddressOf DonneesRecues
monProcess.StartInfo.RedirectStandardInput = True
monProcess.Start()
sortStreamWriter = monProcess.StandardInput
monProcess.BeginOutputReadLine()
sortStreamWriter.WriteLine("oui")
sortStreamWriter.Flush()
End Sub
Private Sub DonneesRecues(ByVal monProcess As Object, ByVal Ligne As DataReceivedEventArgs)
If Not String.IsNullOrEmpty(Ligne.Data) Then
Dim txt As String = Ligne.Data.ToString
Debug.Print(txt)
End If
End Sub
je réponds tout seul du coup, enfin en partie.
Donc après une journée de recherche j'ai réussi à mettre en place un système D.
Public Sub Wait(ByVal time As Integer)
Dim temps_reference As Date = now
While temps_reference.AddSeconds(time) > Now
Threading.Thread.Sleep(10)
Application.doevents()
End While
End Sub
Public Sub test()
Shell("meteo", 1)
SendKeys.Send("oui")
SendKeys.Send("{ENTER}")
Wait(1) 'attends 1 seconde
SendKeys.Send("non")
SendKeys.Send("{ENTER}")
Le problème majeur est donc qu'il va y avoir beaucoup de temps perdu mais je n'ai pas réussi à faire autrement?
Je suis donc encore à la recherche de solution miracle!
Merci beaucoup pour cette réponse ça marche parfaitement.
Juste une dernière question, lorsque je réponds aux questions de mon programme il m'ouvre une fenêtre, nommée "exemple". Cette fenêtre est un déchet et j'aimerais savoir comme la fermer sans pour autant terminer le processus.
J'ai bien regardé avec TerminateProcess je n'arrive pas vraiment à le faire fonctionner
le problème est qu'effectivement j'ai mis cette ligne de code mais la fenêtre s'ouvre quand même. Ce n'est pas la fenêtre principale de l'exe mais une sous-jacente à l'exécution et je n'ai que son nom. Je sais pas si tu as une idée pour fermer une fenêtre dont on a juste le nom...
Juste une dernière question, lorsque je réponds aux questions demon programme il m'ouvre une fenêtre, nommée "exemple". Cette fenêtre est un déchet et j'aimerais savoir comme la fermer
Ce n'est pas la fenêtre principale de l'exe mais une sous-jacente à l'exécution et je n'ai que son nom. Je sais pas si tu as une idée pour fermer une fenêtre dont on a juste le nom...
C'es toi qui a créé cet exécutable ? tu en possède donc la source et tu dois être en mesure de la modifier ?
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.