我基本上试图在vb.net里面运行一个基于java控制台的程序并且显示输出让我们说一个正常的文本框并且还有另一个文本框键入程序的输入。是否有可能做到这一点?在VB内运行基于Java控制台的程序'10
1
A
回答
1
你基本上需要创建一个带有参数的新进程,这个参数是你的文本框的输入。然后,你可以捕捉程序的输出,将其存储在一个变量,并显示在对话框中。
这里有一个小片断:
Dim command As String = "C:\My Dir\MyFile.exe"
Dim args As String = "MyParam1 MyParam2"
Dim proc = New Process() With { _
Key .StartInfo = New ProcessStartInfo() With { _
Key .FileName = "program.exe", _
Key .Arguments = args, _
Key .UseShellExecute = False, _
Key .RedirectStandardOutput = True, _
Key .CreateNoWindow = True _
} _
}
proc.Start()
While Not proc.StandardOutput.EndOfStream
Dim line As String = proc.StandardOutput.ReadLine()
' do something with the line
End While
0
下面是一些样板代码(确保有txtInput
和txtOutput
的形式):
Private m_process As Process
Private m_encoding_for_program As System.Text.Encoding
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
m_encoding_for_program = System.Text.Encoding.GetEncoding(866) 'Adjust as needed
Dim psi As New ProcessStartInfo
psi.CreateNoWindow = True
psi.UseShellExecute = False
psi.FileName = "cmd.exe"
psi.RedirectStandardInput = True
psi.RedirectStandardError = True
psi.StandardErrorEncoding = m_encoding_for_program
psi.RedirectStandardOutput = True
psi.StandardOutputEncoding = m_encoding_for_program
m_process = Process.Start(psi)
AddHandler m_process.OutputDataReceived, AddressOf OutputDataReceived
AddHandler m_process.ErrorDataReceived, AddressOf OutputDataReceived 'Make different handler if needed.
m_process.BeginOutputReadLine()
m_process.BeginErrorReadLine()
End Sub
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
m_process.CancelOutputRead()
m_process.CancelErrorRead()
m_process.Kill()
End Sub
Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtInput.KeyUp
If e.KeyCode = Keys.Enter Then
Dim b = m_encoding_for_program.GetBytes(txtInput.Text)
m_process.StandardInput.BaseStream.Write(b, 0, b.Length)
m_process.StandardInput.WriteLine()
End If
End Sub
Private Sub OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
Me.Invoke(CType(AddressOf Me.ThreadProcSetter, Action(Of Object)), e.Data)
End Sub
Private Sub ThreadProcSetter(ByVal text As Object)
txtOutput.AppendText(DirectCast(text, String) & ControlChars.NewLine)
End Sub
在txtInput
输入命令,然后按回车看结果。确保txtOutput
是多行。
添加错误需要检查。
相关问题
- 1. 从Eclipse控制台运行java程序
- 2. 无法运行基于FastMember的控制台应用程序
- 3. 基于测试控制台的应用程序/程序 - Java
- 4. 基于控制台的应用程序到基于Java的GUI应用程序
- 5. 基于控制台的密钥监听程序Java
- 6. 从控制台运行java
- 7. 我如何从java控制台运行控制台应用程序?
- 8. Java - 如何在Windows中运行控制台程序
- 9. 在Unix下运行java控制台程序
- 10. 无控制台运行Win32程序“silient”
- 11. 保持运行C++程序控制台?
- 12. 运行C#控制台应用程序
- 13. 从Windows服务运行基于COM的c#控制台应用程序(c#)
- 14. 将Java控制台应用程序作为守护程序运行(后台)
- 15. Java控制台程序
- 16. 在后台运行的服务或控制台应用程序?
- 17. 控制远程运行Java SE程序
- 18. 从其他控制台应用程序运行控制台应用程序
- 19. 在没有控制台的情况下运行minGW控制台程序
- 20. 从cmd.exe运行时,基于C的控制台应用程序崩溃,在VS2008调试器中运行良好?
- 21. NetBeans IDE - 如何通过控制台运行Java应用程序
- 22. 如何一直运行Java控制台应用程序?
- 23. NoClassDefFoundError的运行Java从控制台
- 24. 运行c#控制台应用程序内置记事本++
- 25. 如何在后台运行.NET控制台应用程序
- 26. 在后台运行控制台应用程序
- 27. 如何在后台运行控制台应用程序(无UI)?
- 28. 独立于测试从控制台运行程序
- 29. 正常结束基于控制台的多线程程序
- 30. 暂停在控制台2内运行的bash中的进程
谢谢!还有一种方法可以将输入提供给控制台吗? –
不客气:)嗯,你可以使用命令行参数来启动你的程序(如上所述)。然后,你可以发送键击产生的进程。检查这个问题的方式来做到这一点:http://stackoverflow.com/questions/2686865/how-can-i-send-keypresses-to-a-running-process-object –