UWSCでコマンドプロンプト

UWSCコマンドプロンプトの入出力を制御するモジュールを作ってみた。




画面がびかびかするが、上手いやり方がわからん、、、。
びかびか抑止方法を教えて頂いたので、スクリプトを改定。
ただ単純に標準入出力を扱いたいなら、別な方法を推奨。
UWSCで標準入出力制御 - じゅんじゅんのきまぐれ
なんせ、以下の方法はクリップボード経由というダサさですから。


Cmd.uws

OPTION EXPLICIT

IFB GET_UWSC_NAME="Cmd.uws" THEN
	DIM wid = GETID("","ConsoleWindowClass")
	Cmd.SendString(wid, "for /l %i in (1,1,5) do @ping -n 2 www.yahoo.co.jp<#CR>")
	DIM text
	WHILE TRUE
		text = Cmd.GetNewText(wid)
		IF LENGTH(text) THEN PRINT text
		SLEEP(3)
	WEND
ENDIF



MODULE Cmd
	DEF_DLL SendMessageA(Hwnd,Long,Long,Dword):Long:user32
	DIM _getNewText = ""	// GetNewTextで使用
	CONST WM_COMMAND = $111


	PROCEDURE SendString(wid, msg)
		SENDSTR(0, msg)
		//SCKEY(wid, VK_ALT, VK_SPACE, E, P)
		DIM hwnd = IDTOHND(wid)
		// ペースト
		SendMessageA(hwnd, WM_COMMAND, 65521, 0)
	FEND


	FUNCTION GetAllText(wid)
		//SCKEY(wid, VK_ALT, VK_SPACE, E, S)
		//SCKEY(wid, VK_ALT, VK_SPACE, E, Y)
		DIM hwnd = IDTOHND(wid)
		// 全選択
		SendMessageA(hwnd, WM_COMMAND, 65525, 0)
		// コピー
		SendMessageA(hwnd, WM_COMMAND, 65520, 0)
		RESULT = GETSTR(0)
	FEND
	FUNCTION GetNewText(wid)
		DIM newText = GetAllText(wid)
		DIM ret = newText
		DIM l = LENGTH(_getNewText)
		IFB l > 0 THEN
			DIM i = POS(_getNewText, newText)
			IFB i = 1 THEN
				// 先頭を切り落とすだけ
				ret = COPY(newText, l + 1)
			ELSEIF i > 1 THEN
				// 途中から切り落とす
				ret = COPY(newText, i + l)
			ELSE
				// TODO: 流れた場合が未考慮
			ENDIF
		ENDIF
		_getNewText = newText
		RESULT = ret
	FEND

ENDMODULE