Jeg sidder og roder med lidt simpel programmering..
Problemstillingen var at jeg havde to programmer der skulle køre.. Et som kørte i full screen og et andet som skulle køre bagved og holde øje med netværkspakker osv..
Mit "program" gør at den starter dette værktøj og tilfører det det nødvendige input for at være klar og derefter starter det andet program, så man ikke behøver andet end at starte mit program op.. Simpelt!
Dog vil jeg gerne have det lavet sådan, at det program jeg har lavet, viser det bagved liggendes output i en textbox.. Det cmd lignende program der kører bagved kommer nemlig konstant med output, og det er så dette jeg gerne vil have vist i mit vb.net program!
Input er ikke nødvendigt.. Kun outputtet skal jeg have vist i min textbox og det skal helst opdatere med det samme outputtet kommer i det bagved liggende cmd program (eller inden for 3 seks ca)!
Nogen som har nogle idéer ? Er det noget med Pipes ?
NB : Bær lige over med mig for jeg har aldrig programmeret før !
jeg har en gang lavet noget i vb (før .net) med chkdsk - der kunne jeg hente chkdsk data løbende (% færdig), og vise det i mit program. Chkdsk kørte så i et skjult vindue uden at blive vist på processlinjen - kun mit program var synligt. Der var så noget med vb ikke blev opdateret (pga .net fremkomst) og sikkerhed i vista/win7 forhindrede den type kald - men .net må da have tilsvarende mulighed. Jeg har sourcekoden liggende, hvis du kan bruge den til noget.
Du skal lave en tekstbox med navn tb og klikke i tb
Public Class Form1
Private WithEvents tb As New TextBox
Sub New() InitializeComponent() Me.Text = "click the textbox" Me.Controls.Add(tb) tb.Dock = DockStyle.Fill tb.ReadOnly = True tb.ScrollBars = ScrollBars.Both tb.Multiline = True Me.Width = 500 End Sub
Sub Go() Dim p As New Process p.StartInfo.FileName = "ping.exe" p.StartInfo.Arguments = "www.bbc.co.uk" p.StartInfo.UseShellExecute = False p.StartInfo.RedirectStandardOutput = True AddHandler p.OutputDataReceived, AddressOf HelloMum p.Start() p.BeginOutputReadLine() End Sub
Sub HelloMum(ByVal sender As Object, ByVal e As DataReceivedEventArgs) UpdateTextBox(e.Data) End Sub
Private Delegate Sub UpdateTextBoxDelegate(ByVal Text As String) Private Sub UpdateTextBox(ByVal Tex As String) If Me.InvokeRequired Then Dim del As New UpdateTextBoxDelegate(AddressOf UpdateTextBox) Dim args As Object() = {Tex} Me.Invoke(del, args) Else tb.Text &= Tex & Environment.NewLine End If End Sub
Private Sub tb_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles tb.Click Go() End Sub
Tak Nissen har fået ovenstående til at fungere faktisk!
Men det vil kræve en smule tilpasning
Ser du, mit kode er lavet således at det starter et program op og sender et tastetryk til programmet (My.Computer.Keyboard.SendKeys("1", True)). Hvis jeg bruger koden vist ovenfor åbner den så bare programmet igen når det kører det kode. Mon man kan lave det sådan at der i det ovenstående kode, et sted i midten bliver sendt taste trykket 1 til programmet ?
Jeg ligger lige mit kode ind så du/i kan se det.. Det kan være det er nemmere at se hvad det er jeg vil hvis du/i kan se koden :)
Public Class Main
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim ProcID As Integer RichTextBox1.Text = "* - Starter software..." Dim p As New Process p.StartInfo.FileName = TextBox1.Text 'softwaren der startes er skrevet i denne tekstboks (blabla.exe) p.StartInfo.Arguments = "" p.StartInfo.UseShellExecute = False p.StartInfo.RedirectStandardOutput = True p.StartInfo.RedirectStandardInput = True p.StartInfo.CreateNoWindow = True AddHandler p.OutputDataReceived, AddressOf HelloMum p.Start() p.BeginOutputReadLine() Dim SW As System.IO.StreamWriter = p.StandardInput SW.WriteLine("1") 'her sender jeg kommandoen til programmet så det går igang. System.Threading.Thread.Sleep(1000) RichTextBox1.Text = RichTextBox1.Text & vbCrLf & "* - Starter sekundær software..." System.Threading.Thread.Sleep(500) ProcID = Shell(TextBox2.Text, AppWinStyle.NormalFocus) End Sub
Sub HelloMum(ByVal sender As Object, ByVal e As DataReceivedEventArgs) UpdateTextBox(e.Data) End Sub
Private Delegate Sub UpdateTextBoxDelegate(ByVal Text As String)
Private Sub UpdateTextBox(ByVal Tex As String) If Me.InvokeRequired Then Dim del As New UpdateTextBoxDelegate(AddressOf UpdateTextBox) Dim args As Object() = {Tex} Me.Invoke(del, args) Else RichTextBox2.Text &= Tex & Environment.NewLine End If End Sub
Efter at have fiflet meget frem og tilbage med det her, fandt jeg ud af, at den exe fil jeg skal sende kommandoer til ikke understøtter det igennem det her, men kun igennem sendkeys.. Så går jeg ikke ud fra at det kan lade sig gøre :(
Hvis du tager eksemplet fra #9 og indsætter dit program så skulle det gerne virke. Kan ikke se hvorfor du har omskrevet koden så meget.Det giver ingen mening for mig
Jeg kan lige forsøge mig med at skrive mit program ind i det kode i 9# istedet for ping.exe..
Grunden til at jeg har skrevet det om er fordi at jeg faktisk alligevel skal have sendt input til programmet.. Dog drejer det sig bare om ét enkelt tastetryk.
SendKeys er nok nærmere til hvis du åbner en applikation som kører ved siden af.. Så kan du sende tastetryk til applikationen, men i det kode der er skrevet i #9 så åbner applikationen jo inde i ens VB app og derfor skal man på en måde have omdirigeret input til programmet gennem ens app.
Har lige forsøgt med det du skrev Nissen.. Og det virker desværre ikke. Det ser ikke ud som om den modtager det input jeg sender.
Her er lige et uddrag af min kode: Sub Go() Dim p As New Process p.StartInfo.FileName = "test.exe" p.StartInfo.Arguments = "" p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden p.StartInfo.UseShellExecute = False p.StartInfo.RedirectStandardOutput = True p.StartInfo.RedirectStandardInput = True AddHandler p.OutputDataReceived, AddressOf HelloMum p.Start() p.BeginOutputReadLine() System.Threading.Thread.Sleep(1000) 'lige til at give exe filen 1 sekund at starte op i. p.StandardInput.Write("1") End Sub
Resten af koden er fuldstændigt den samme som den i #9.. Som du kan se bruger jeg System.Threading.Thread.Sleep til at give det program der skal sendes kommando til, 1 sekund til at starte op i.
En anden ting der undrer mig er at p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden ikke ser ud til at virke.. vinduet kommer stadig frem, men dette er dog ligegyldigt, ville bare lige nævne det.
Jeg har også prøvet med StandardInputWriteLine, men med samme resultat
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.