コンソール入力バッファにデータを書き込むコマンドをVB.NETで作る
コマンドプロンプトでは、コマンドを入力してエンターキーを押すまでは、コマンドラインが編集できます。
しかし、コマンドからコマンドラインを出力しても、それを直接、編集して実行することはできません。
また、バッチファイルの中からDOSKEYマクロを実行することはできません。
これらは、コマンドからコンソール入力バッファに書き込めば、可能です。
vbc KeyIn.VB
Public Class Class1
Private Structure KEY_EVENT_RECORD
Dim bKeyDown As Integer
Dim wRepeatCount As Short
Dim wVirtualKeyCode As Short
Dim wVirtualScanCode As Short
Dim UnicodeChar As UShort
Dim dwControlKeyState As Integer
End Structure
Private Structure INPUT_RECORD
Dim EventType As Short
Dim KeyEvent As KEY_EVENT_RECORD
End Structure
Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Integer) As Integer
Private Declare Function WriteConsoleInput Lib "kernel32" Alias "WriteConsoleInputW" (ByVal hConsoleInput As Integer, ByVal lpBuffer() As INPUT_RECORD, ByVal nLength As Integer, ByRef lpNumberOfEventsWritten As Integer) As Integer
Private Const KEY_EVENT As Integer = 1s
Private Const STD_INPUT_HANDLE As Integer = -10
Public Shared Sub Main()
Dim CommandLine As String = System.Environment.CommandLine
Dim FileName As String = ""
Dim Quoted As Boolean = False
Dim k As Integer
For k=0 To CommandLine.Length-1
If CommandLine.Chars(k) = """" Then
Quoted = Not Quoted
ElseIf Not Quoted AndAlso CommandLine.Chars(k) = " " Then
Exit For
End If
Next
FileName = CommandLine.Substring(0,k).Replace("""","")
CommandLine = CommandLine.Remove(0,k).Trim()
'Console.Error.WriteLine("FileName:{0}",FileName)
'Console.Error.WriteLine("Arguments:{0}",CommandLine)
KeyIn(CommandLine.Replace("{CR}",Chr(13)))
End Sub
Private Shared Sub KeyIn(s As String)
Dim lpBuffer() As INPUT_RECORD
Dim lpNumberOfEventsWritten As Integer
Dim hConsoleInput As Integer = GetStdHandle(STD_INPUT_HANDLE)
ReDim lpBuffer(Len(s)*2-1)
For k As Integer = 0 To UBound(lpBuffer)
lpBuffer(k).EventType = KEY_EVENT
lpBuffer(k).KeyEvent.bKeyDown = (k + 1) Mod 2
lpBuffer(k).KeyEvent.wRepeatCount = 0
lpBuffer(k).KeyEvent.wVirtualScanCode = 0
lpBuffer(k).KeyEvent.wVirtualKeyCode = 0
lpBuffer(k).KeyEvent.UnicodeChar = AscW(Mid(s,1 + (k \ 2),1))
lpBuffer(k).KeyEvent.dwControlKeyState = 0
Next
WriteConsoleInput(hConsoleInput, lpBuffer, UBound(lpBuffer)+1, lpNumberOfEventsWritten)
End Sub
End Class
« コマンドプロンプトのコンソールログを採取するコマンドをVB.NETで作る(その2) | トップページ | コンソール入力バッファにデータを書き込むコマンドをVB.NETで作る(その2) »