2017年9月
          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
無料ブログはココログ

« コマンドプロンプトのコンソールログを採取するコマンドをVB.NETで作る(その2) | トップページ | コンソール入力バッファにデータを書き込むコマンドをVB.NETで作る(その2) »

2008年9月 1日 (月)

コンソール入力バッファにデータを書き込むコマンドを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) »