起動させたコマンドプロンプトにコマンドを逐次送信したいということですか?
以下のコードは私の作りかけのプログラムから抜き出して少し変更したものですが、
もしかしたらこれが使えるかもしれません。
コマンドプロンプトの起動は exec "コマンド" の代わりに、
exec_ "コマンド" を使ってください。そうすれば
writeInput "文字列" で文字列を送信できます。
("exit"で終了させることが出来ないという欠点がありますが。)
#include "kernel32.as"
#uselib "kernel32.dll"
#func global AttachConsole "AttachConsole" sptr
#module
#define STD_INPUT_HANDLE (-10)
#define KEY_EVENT 0x0001 // Event contains key event record
#define NLS_DBCSCHAR 0x00010000 // DBCS for JPN: SBCS/DBCS mode.
#define NLS_HIRAGANA 0x00040000 // DBCS for JPN: Hiragana mode.
#define NLS_IME_CONVERSION 0x00800000 // DBCS for JPN: IME conversion.
/*
exec_ "コマンド"
HSPからコマンドプロンプトに文字列を入力するための、
コンソールプロセスを実行する。
*/
#deffunc exec_ str _cmdline
cmdline = _cmdline
sdim si, 68 : lpoke si, 0, 68
sdim pi, 16
CreateProcess 0, varptr(cmdline), 0, 0, 1, 0, 0, 0, varptr(si), varptr(pi)
if (stat == 0) : return
hproc = lpeek(pi, 0)
pid = lpeek(pi, 8)
//コンソールの stdin を取得
await 100
AttachConsole pid
GetStdHandle STD_INPUT_HANDLE
stdin = stat
return
/*
writeInput "文字列"
コマンドプロンプトに文字列を入力する。
*/
#deffunc writeInput str _string
// 改行コード'\n'は無いものと仮定
string = _string
nBuf = strlen(string) + 2
sdim buf, nBuf * 20
repeat strlen(string)
wpoke buf, 0 + cnt*20, KEY_EVENT
lpoke buf, 4 + cnt*20, 1 // bKeyDown
wpoke buf, 8 + cnt*20, 1 // wRepeatCount
poke buf, 14 + cnt*20, peek(string, cnt) // AsciiChar
lpoke buf, 16 + cnt*20, (NLS_DBCSCHAR | NLS_HIRAGANA | NLS_IME_CONVERSION)
loop
// 最後にEnterキーを追加
i = 0
repeat 2, strlen(string)
wpoke buf, 0 + cnt*20, KEY_EVENT
lpoke buf, 4 + cnt*20, (1-i) // bKeyDown :: 1回目=押し下げ, 2回目=押し上げ
wpoke buf, 8 + cnt*20, 1 // wRepeatCount
wpoke buf, 10 + cnt*20, 13 // wVirtualKeyCode
wpoke buf, 12 + cnt*20, 28 // wVirtualScanCode
poke buf, 14 + cnt*20, 13 // uChar.AsciiChar
lpoke buf, 16 + cnt*20, (NLS_DBCSCHAR | NLS_HIRAGANA)
i++
loop
num = 0
WriteConsoleInput stdin, varptr(buf), nBuf, varptr(num)
return
/*
exec_ で起動したプロセスを終了する。
*/
#deffunc exitConsole
FreeConsole
TerminateProcess hproc, 0
stdin = 0
return
#global
// テストプログラム(参考)
#if 0
*main
title "Shift+Enterで入力"
onexit *exit
exec_ "cmd"
inputString = ""
pos 150, 100
input inputString, 340, 20 : id_input = stat
state0 = 0
repeat
getkey shift, 16
getkey enter, 13
state = shift && enter
if (state0 == 0 && state == 1) {
state = 1
gosub *fire
}
await
state0 = state
loop
stop
*fire
writeInput inputString
objprm id_input, ""
return
*exit
exitConsole
end
#endif