VB.NET有很多值得学习的地方,这里我们主要介绍VB.NET SendKeys方法,包括介绍控制过程输入输出等方面。
有时候,你可能不仅仅想使用简单的命令行,而是想把更复杂的输入信息直接发送到启动的过程中。前面例子中的把输出导入到文件中的方法,并不总是最好的选择。在许多情况下,把输出直接导回你的应用程序可能更有效。对于使用StdIn、StdOut和StdErr的程序,比如控制台应用程序,你可以覆盖默认方法,提供一个StreamWriter来输入,并提供一个StreamReaders来读取StdOut和StdErr输出值。当你启动过程的时候,你需要设置ProcessStartInfo对象的RedirectStandardInput、RedirectStandardOutput和 RedirectStandardError属性为True。然后,在启动过程之后,使用Process对象的StandardInput、StandardOutput和StandardError属性来把输入输出流分配到StreamReader和StreamWriter对象。
警告:默认情况下,框架使用Win32 ShellExecute函数,在内部启动过程;但是当你想再分配输入输出流的时候,你必须在启动过程之前设置 ProcessStartInfo.UseShellExecute属性为False。注意当你那么做的时候,你必须要么指定到文件的完全路径,要么文件位置必须在环境路径中。例如,下面的代码创建一个不可见的窗口,取得系统目录中.com文件的目录列表,然后在一个消息框中显示结果。
- Dim myProcess As Process = New Process()
- Dim s As String
- myProcess.StartInfo.FileName = "cmd.exe"
- myProcess.StartInfo.UseShellExecute = False
- myProcess.StartInfo.CreateNoWindow = True
- myProcess.StartInfo.RedirectStandardInput = True
- myProcess.StartInfo.RedirectStandardOutput = True
- myProcess.StartInfo.RedirectStandardError = True
- myProcess.Start()
- Dim sIn As StreamWriter = myProcess.StandardInput
- sIn.AutoFlush = True
- Dim sOut As StreamReader = myProcess.StandardOutput
- Dim sErr As StreamReader = myProcess.StandardError
- sIn.Write("dir c:\Windows\system32\*.com" & _
- System.Environment.NewLine)
- sIn.Write("exit" & System.Environment.NewLine)
- s = sOut.ReadToEnd()
- If Not myProcess.HasExited Then
- myProcess.Kill()
- End If
- MessageBox.Show("The 'dir' command window was " & _
closed at: " & myProcess.ExitTime & "." & _
System.Environment.NewLine & "Exit Code: " & _ myProcess.ExitCode)- sIn.Close()
- sOut.Close()
- sErr.Close()
- myProcess.Close()
- MessageBox.Show(s)
对于不使用StdIn的程序,你可以使用VB.NET SendKeys方法来输入按键事件。例如,下面这些代码启动记事本并输入一些文本。
- Dim myProcess As Process = New Process()
- myProcess.StartInfo.FileName = "notepad"
- myProcess.StartInfo.WindowStyle = _
- ProcessWindowStyle.Normal
- myProcess.EnableRaisingEvents = True
- AddHandler myProcess.Exited, _
- AddressOf Me.SendKeysTestExited
- myProcess.Start()
- myProcess.WaitForInputIdle(1000)
- If myProcess.Responding Then
- System.Windows.Forms.SendKeys.SendWait( _
- "This text was entered using the " & _
- "System.Windows.Forms.SendKeys method.")
- Else
- myProcess.Kill()
- End If
你可以使用VB.NET SendKeys方法发送任何键入值,包括Alt、Ctrl和Shift键;所以,你可以使用它来保存或载入文件、退出或者执行其他菜单驱动的命令。然而、VB.NET SendKeys方法只发送键入值到活动窗口(就是有焦点的那个窗口),所以如果一个应用程序在这个过程中失去焦点,那么可能会出现问题。
【编辑推荐】