IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

VB.Net-Synchroniser la sortie d'un processus dans une RichTextBox ? [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Téléconseiller
    Inscrit en
    Juin 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Téléconseiller
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2010
    Messages : 119
    Points : 77
    Points
    77
    Par défaut VB.Net-Synchroniser la sortie d'un processus dans une RichTextBox ?
    Salut

    je cherche comme le titre l'indique a synchroniser la sortie d'un processus dans une RichTextBox ( si la solution est bien cela ^^ )

    Pour tenter de faire clair et simple :

    j'ai une form1 avec :
    - 1 RichTexBox
    - 1 button
    - 1 TextBox

    Le Button de ma Form1 fait appel à un module qui à pour but de lancer le Processus CMD.exe avec les arguments inscrit dans ma Textbox .

    je ne sais pas si c'est la bonne solution mais :
    ce que j'aimerai c'est synchroniser le résultat dans ma RichTextBox sans perdre le processus afin de pouvoir lui repasser des argument a partir du résultat obtenu.

    donc en gros utiliser mon interface VB.Net de la même manière que si j'était dans ma console CMD.exe.

    Et là beaucoup se demanderont bien le pourquoi du comment hé bah mon but serai par la suite de pouvoir simplement administrer un script Python avec mon interface VB.Net.

    Je ne sais pas si je suis sur la bonne piste mais j'ai chercher du côté de :
    https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
    je ne sais pas si j'ai utiliser la bonne manière mais mes test non pas été concluant car j'ai pas réussis à obtenir quoique ce soit dans ma RichTextBox ^^.

    Mon code actuel est :
    La Form1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Public Class Form1
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     
        End Sub
     
        Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
     
        End Sub
     
            Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
     
        End Sub
     
            Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            TextBox1.Text.RunCMD(WaitForProcessComplete:=True)
        End Sub
     
        Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
     
        End Sub
    End Class
    Mon module "Extension"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    Imports System.Runtime.CompilerServices
    ''' <summary>
    ''' INFO FORM1
    ''' DANS LE "Private Sub Button1_Click" TextBox1.Text.RunCMD(WaitForProcessComplete:=True)
    ''' </summary>
    Public Module Extensions
        ''' <summary>
        ''' Extension method to run string as CMD command.
        ''' </summary>
        ''' <param name="command">[String] Command to run.</param>
        ''' <param name="ShowWindow">[Boolean](Default:False) Option to show CMD window.</param>
        ''' <param name="WaitForProcessComplete">[Boolean](Default:False) Option to wait for CMD process to complete before exiting sub.</param>
        ''' <param name="permanent">[Boolean](Default:False) Option to keep window visible after command has finished. Ignored if ShowWindow is False.</param>
        <Extension>
        Public Sub RunCMD(command As String, Optional ShowWindow As Boolean = False, Optional WaitForProcessComplete As Boolean = False, Optional permanent As Boolean = False)
            Dim p As Process = New Process()
            Dim pi As ProcessStartInfo = New ProcessStartInfo()
            pi.Arguments = " " + If(ShowWindow AndAlso permanent, "/K", "/C") + " " + command
            pi.FileName = "cmd.exe"
     
            pi.CreateNoWindow = Not ShowWindow
            If ShowWindow Then
                pi.WindowStyle = ProcessWindowStyle.Normal
            Else
                pi.WindowStyle = ProcessWindowStyle.Hidden
            End If
     
            'Debug / test
            If Form1.CheckBox1.Checked Then
                pi.WindowStyle = ProcessWindowStyle.Normal
                'pi.Arguments = " " + If(ShowWindow AndAlso permanent, "/K", "/C") + " " + command + " " + "&" + "pause"
                'pi.Arguments = " " + "/K" + " " + command 
            End If
            '
     
            p.StartInfo = pi
            p.Start()
     
            If WaitForProcessComplete Then Do Until p.HasExited : Loop
            ' Debug 
            MessageBox.Show("parametre : " + pi.Arguments, "cmd : " + command)
            '
        End Sub
    End Module
    Voilà en espérant avoir été clair sur ma demande et espérant obtenir un peu de piste afin que je puisse continuer sur mon projet

    Pour info même si cela n'interfère pas avec ma demande, c'est uniquement pour les retissant qui ce demande bien ce que j'aimerai faire avec l'idée de reproduire une console msDOS dans une interface VB, voici en faite mon code python que je souhaite administrer

    info le code Python ci-dessous est fonctionnel donc c'est cadeau ^^ ( nécessite seulement de spécifier son APIKEY entre les '' à la ligne -> 30. ' -- ICI SPECIFIER LE APIKEY -- ' )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    # coding: utf8
    #!/python2.7
    ################################################################################################################
    # La Pub :
    # Facebook-> 
    # Youtube -> 
    # Le site -> 
     
    # Les sources :
    # original source "Adam Meyers ~ CrowdStrike" additional source "Chris Clark ~ GD Fidelis CyberSecurity"
     
    				# \*******************************************************************/
    				# \*   Modification - Personnalisation 2017 : Zitoune-@nticip-WIN32                          */
    				# \*        VirusTotalAPI By Zitoune-@nticip-WIN32 Version 2.0	 	                    */
    				# \* 					   Licence MIT- "Expat"		   			            */
    				# \*******************************************************************/
     
    #	Liens utiles :
    #	info comment obtenir son APIKEY -> https://www.virustotal.com/fr/documentation/public-api/
    #	info concernant la licence -> https://fr.wikipedia.org/wiki/Licence_MIT#
    ################################################################################################################
    from __future__ import unicode_literals
    import requests
    import json, urllib, urllib2, argparse, hashlib, re, sys
    from pprint import pprint
     
    class VirusTotalAPI():
        def __init__(self):
            self.api = ' -- ICI SPECIFIER LE APIKEY -- '
            self.base = 'https://www.virustotal.com/vtapi/v2/'
     
    #SCAN
     
        def getReport(self,md5):
            param = {'resource':md5,'apikey':self.api}
            url = self.base + "file/report"
            data = urllib.urlencode(param)
            result = urllib2.urlopen(url,data)
            jdata =  json.loads(result.read())
            return jdata
     
    #UPLOAD
     
        def upload(self,files):
            url = self.base + "file/scan"
            params = {'apikey':self.api}
            files = {'file': (files, open(files, 'rb'))}
            response = requests.post(url, files=files, params=params)
            f = open("ScanID.log", "w")
            f.write(str(response.json()))
            f.close
            print ""
            print "\n\tLe fichier Log a ete generer : -- ScanID.log --"
            print ""
            print "\n\tLe fichier est actuellement en trein d'etre analyser sur VirusTotal ..."
            print "\n\tpatienter +- 30 secondes avant d'utiliser l'option -s /v /L"
            print ""
            print response.json()
     
    #HASH MD5
     
    def checkMD5(checkval):
      if re.match(r"([a-fA-F\d]{32})", checkval) == None:
        md5 = md5sum(checkval)
        return md5.upper()
      else: 
        return checkval.upper()
     
    def md5sum(filename):
      fh = open(filename, 'rb')
      m = hashlib.md5()
      while True:
          data = fh.read(8192)
          if not data:
              break
          m.update(data)
      return m.hexdigest()
     
    #AFFICHAGE CONTRENDU
     
    def parse(it, md5, verbose, jsondump):
      if it['response_code'] == 0:
        print ""
        print "\n\tLe Hash :" + md5 + " -- n'est pas repertorier sur VirusTotal --"
        print""
        return 0
      print "\n\tResultats du MD5: ",it['md5'],"\n\n\Detection par: ",it['positives'],'/',it['total'],'\n'
      if 'BitDefender' in it['scans']:
        print '\tBitDefender Detection:',it['scans']['BitDefender']['result'],'\n'
      if 'Kaspersky' in it['scans']:
        print '\tKaspersky Detection:',it['scans']['Kaspersky']['result'], '\n'
      if 'ESET-NOD32' in it['scans']:
        print '\tESET Detection:',it['scans']['ESET-NOD32']['result'],'\n'
     
      print '\tScanner le:',it['scan_date']
     
      if jsondump == True:
        jsondumpfile = open("ScanID" + md5 + ".log", "w")
        pprint(it, jsondumpfile)
        jsondumpfile.close()
        print "\n\tLe fichier Log a ete generer -- " + "ScanID" + md5 + ".log"
        print "utiliser l'option -d si vous souhaitez envoyer le fichier sur VirusTotal"
     
      if verbose == True:
        print '\n\tDetails des rapports de VirusTotal :\n'
        for x in it['scans']:
         print '\t', x,'\t' if len(x) < 7 else '','\t' if len(x) < 14 else '','\t',it['scans'][x]['detected'], '\t',it['scans'][x]['result']
     
    #MENU
     
    def main():
      opt=argparse.ArgumentParser(description="Scanner de HASH et de fichier sur VirusTotal By Zitoune-@nticip-WIN32")
      opt.add_argument("HashorPath", help="Enter un hash MD5/SHA1/256 ou le nom de votre fichier")
      opt.add_argument("-s", "--search", action="store_true", help="Rechercher sur VirusTotal")
      opt.add_argument("-v", "--verbose", action="store_true", dest="verbose", help="Activer les details des rapports de VirusTotal")
      opt.add_argument("-L", "--jsondump", action="store_true",help="Generer un fichier log (ScanIDXXX.log)")
      opt.add_argument("-d", "--upload", action="store_true", help="Scanner un fichier sur VirusTotal")
      if len(sys.argv)<=2:
        opt.print_help()
        sys.exit(1)
      options= opt.parse_args()
      ScanID=VirusTotalAPI()
      md5 = checkMD5(options.HashorPath)
      files = (options.HashorPath)
      if options.search or options.jsondump or options.verbose:
        parse(ScanID.getReport(md5), md5 ,options.verbose, options.jsondump)
      if options.upload:
        ScanID.upload(files)
     
    if __name__ == '__main__':
        main()
    Merci D'avoir pris le temps de me lire et de se pencher sur le sujet

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 166
    Points
    10 166
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Cela me semble plus compliqué que cela. Sauf horreur de ma part quand tu lances l'Invite de Commande, tu le fais dans un processus séparé, et agir sur un autre processus à partir d'un processus donné, n'est peut-être pas possible, ou du moins pas très évident.

    Ceci dit, Visual Studio, offre un support pour Python, mais cela resterait à voir dans ton cas.

    VS-2017, VS-2015 : Dans le programme d'installation de VS

    VS-2013 et peut-être avant : Python Tools for Visual Studio

    Documentation

  3. #3
    Membre régulier
    Homme Profil pro
    Téléconseiller
    Inscrit en
    Juin 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Téléconseiller
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2010
    Messages : 119
    Points : 77
    Points
    77
    Par défaut
    Bonjour et merci de votre réponse, effectivement je continue à chercher et cela semble bien compliquer j'ai trouver quelque vielle sources ici et là traitant en partie le sujet mais cela est que partiellement fonctionnel donc je tente d'éplucher les sources et mes recherche afin d'arriver à mes fin ^^.

    Je ne suis pas arrêter à un langage d'utilisation précis aillant aucune réel connaissance dans chacun des langage, je vais regarder la solutions que vous me proposer savoir si cela peu me convenir
    merci

  4. #4
    Membre régulier
    Homme Profil pro
    Téléconseiller
    Inscrit en
    Juin 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Téléconseiller
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2010
    Messages : 119
    Points : 77
    Points
    77
    Par défaut
    Salut

    alors je reviens sur mon propre post après quelque jours a avoir soulever tout les coin du web et avoir pris quelque cacher pour la tête

    mais je reviens avec de bonne nouvelle effectivement +-3 jours intensive de recherche et j'ai découvert pas mal de ressource datant peu être de bien longtemps mais comme quoi elle serve toujours

    il serai impossible de cité toutes les sources par lesquels je suis passer pour arriver à mes fin tellement j'ai parcouru le msdn et tester tout de long en large et en travers comme exemple ici et là en c# et vb sur différent site xD

    je vais cependant retenir 2 sources qui mon beaucoup aider :

    je citerai en premier http://aspic.developpez.com/sources/...e=multi_thread

    et la seconde : https://www.daniweb.com/programming/...put-to-listbox

    grâce à ces deux sources en particulier je pense ( j'espère) même si c'est loin d'être fini avoir réussis à faire quelque chose de pas trop dégelasse .

    j'ai essayer de commenter au mieux pour comprendre moi même ainsi que pour les éventuel lecteur de ce post les experts comprendrons que je pratique pas tout les jours ^^ ( je fait çà juste pour le fun en faite mais bon ... )
    quoiqu'il en soit j'ai essayer de gérer les erreurs éventuel et surtout la possibilité d'activer ou non le processus récupérer son id.

    c'est loin d'être fini mais je pense que c'est une bonne base en attendant éventuel avis .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    Option Explicit On 'evite les déclarations implicites
    Option Strict On 'evite les conversions implicites
     
    Imports System
    Imports System.IO
    Imports System.Text
    Imports System.Diagnostics
    Imports System.Threading
     
    Public Class Form1
        Inherits Form
        Private datacmd As StreamWriter
        Private p As Process
        Dim info As New ProcessStartInfo()
     
        'permet de concerver le processus ouvert et accecible tout le temps
        Public Sub New()
            InitializeComponent()
        End Sub
     
        'demarage de la form et du processus
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            If True Then
                info.Arguments = "/k"
                info.FileName = "cmd.exe"
                info.UseShellExecute = False
                info.RedirectStandardOutput = True
                info.RedirectStandardInput = True
                info.RedirectStandardError = True
                info.StandardOutputEncoding = Encoding.GetEncoding(850)
                info.CreateNoWindow = True
            End If
            p = New Process()
            p.StartInfo = info
            AddHandler p.OutputDataReceived, AddressOf OutputHandler
            p.Start()
            p.BeginOutputReadLine()
            datacmd = p.StandardInput
            L_info.Text = "PID : " + (p.Id.ToString)
        End Sub
     
        Private Delegate Sub Ajout(ByVal Valeur As String) 'declare un délégué
        'background principale
        Private Sub BGW2_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGW2.RunWorkerCompleted
            L_info.Text = "c'est fini !!"
        End Sub
     
        ' execute les commande sur un second background
        Private Sub B_Del_BGW_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles B_Del_BGW.Click
            'L_Resultat.Clear() 'possibilité de vider le richtexbox ici
            L_info.Text = "Wait please..."
            BGW2.RunWorkerAsync() 'demarre le BGW 2
            Try
                If CBool((p.ExitCode.ToString)) Then 'verifie si le processus est en cours
                    L_info.Text = ""
                    MsgBox("Information" & vbCrLf & vbCrLf & "Erreur : Le processus n'est pas démarrer !") 'fin de l'opération            
                End If
     
            Catch ex As Exception
     
            End Try
        End Sub
     
        ' appelle de la procédure d'ajout d'element dans la richtextbox
        Private Sub BGW2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW2.DoWork
            TraitementBis()
        End Sub
     
        'traitement qui retourne le resultat du processus dans la richtextbox
        Private Sub TraitementBis()
            Dim cmd As String = TextBox1.Text.Trim()
            If Not String.IsNullOrEmpty(cmd) Then
                datacmd.WriteLine(cmd + " " + "&" + "cd") '"&" + "cd" permet d'afficher le repertoire courant en fin de ligne
            End If
        End Sub
     
        'redirection 
        Private Sub OutputHandler(sendingProcess As Object, e As DataReceivedEventArgs)
            If L_Resultat.InvokeRequired Then
                Me.Invoke(New System.Diagnostics.DataReceivedEventHandler(AddressOf OutputHandler), New Object() {sendingProcess, e})
                Return
            End If
            If Not String.IsNullOrEmpty(e.Data) Then
                L_Resultat.AppendText(e.Data + System.Environment.NewLine)
            End If
            TextBox1.Clear()
        End Sub
     
        'fermeture de la form
        Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            Try
                p.Kill()
            Catch ex As Exception
     
            End Try
            Me.Dispose()
        End Sub
        'arret du processus
        Private Sub B_Sans_Click(sender As Object, e As EventArgs) Handles B_Sans.Click
            Try
                p.Kill()
                If CBool((p.ExitCode.ToString)) Then 'verifie si le processus est en cours
                    L_info.Text = ""
                Else
                    L_info.Text = (p.Id.ToString) 'affiche le PID du processus
                End If
            Catch ex As Exception
     
            End Try
        End Sub
        're load la form permet de reactiver le processus si il a été arreter
        Private Sub B_Avec_Click(sender As Object, e As EventArgs) Handles B_Avec.Click
            Me.Form1_Load(sender, e)
            Me.Show()
        End Sub
    End Class
    en espérant que sa en aide aussi plus d'un qui rechercherai dans le futur !
    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/11/2014, 10h47
  2. [vb.net 1.1] Faire défilé du texte dans une image
    Par malhivertman1 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 09/11/2006, 16h31
  3. Réponses: 4
    Dernier message: 29/08/2006, 17h44
  4. Réponses: 2
    Dernier message: 14/10/2005, 17h05
  5. [VS.net] Vérifier le présence d'un caractère dans une chaine
    Par arnolem dans le forum Windows Forms
    Réponses: 15
    Dernier message: 10/09/2005, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo