#module ; 必要となるAPIや定数の定義 #uselib "user32.dll" #cfunc global GetForegroundWindow "GetForegroundWindow" #cfunc global GetWindowThreadProcessId "GetWindowThreadProcessId" int,int #func global AttachThreadInput "AttachThreadInput" int,int,int #func global SetForegroundWindow "SetForegroundWindow" int #func global SendMessage "SendMessageA" int,int,int,int #func global FindWindow "FindWindowA" int,int #func global MoveWindow "MoveWindow" int,int,int,int,int,int #func global GetWindowRect "GetWindowRect" int,int #func global OpenClipboard "OpenClipboard" int #func global SetClipboardData "SetClipboardData" int,int #func global EmptyClipboard "EmptyClipboard" #func global CloseClipboard "CloseClipboard" #func global ShowWindow "ShowWindow" int,int #func global PostMessage "PostMessageA" int,int,int,int #func global MapVirtualKey "MapVirtualKeyA" int,int #func global keybd_event "keybd_event" int,int,int,int #uselib "kernel32.dll" #cfunc global GetCurrentThreadId "GetCurrentThreadId" #func global GetEnvironmentVariable "GetEnvironmentVariableA" var,var,int #func global GlobalAlloc "GlobalAlloc" int,int #func global GlobalLock "GlobalLock" int #func global GlobalUnlock "GlobalUnlock" int #func global lstrcpy "lstrcpy" int,int #func global GetVersionEx "GetVersionExA" int #define global CF_OEMTEXT $00000007 #define global MAX_PATH 260 #define global WM_SYSCOMMAND $00000112 #define global SC_CLOSE $0000F060 #define global WM_COMMAND $00000111 #define global SW_HIDE 0 #define global SW_SHOW 5 #define global EM_SETMARGINS $000000D3 ;***** アクティブウィンドウの制御 ***** #deffunc actwin int prm1 handle=prm1 if handle!0 : hsphwnd=handle : else : hsphwnd=hwnd if hsphwnd==0 : return -1 ThreadId1=GetWindowThreadProcessId(GetForegroundWindow(),varptr(PID)) ThreadId2=GetCurrentThreadId() AttachThreadInput ThreadId2,ThreadId1,1 SetForegroundWindow hsphwnd AttachThreadInput ThreadId2,ThreadId1,0 return 0 ;***** 環境変数の取得 (COMSPEC) ***** #deffunc getenvval var prm1 sdim cp,MAX_PATH+2 ev="Comspec" ;環境変数(COMSPEC)を設定 GetEnvironmentVariable ev,cp,MAX_PATH+2 prm1=cp : ret=stat sdim cp,0 return ret ;***** クリップボードにテキストデータを設定 ***** #deffunc setcliptext str prm1 OpenClipboard ret=stat : if ret!0 : EmptyClipboard ;GMEM_MOVEABLE 2 ls=strlen(prm1)+1 : sdim strData,ls strData = prm1 GlobalAlloc 2,ls lngHwnd=stat if lngHwnd!0 { GlobalLock lngHwnd lngMem=stat if lngMem!0 { lstrcpy lngMem,varptr(strData) : ret=stat if ret!0 { SetClipboardData CF_OEMTEXT,lngHwnd lngRet=stat } GlobalUnlock lngHwnd : lngRet=stat } } CloseClipboard : sdim strData,0 return stat ;***** コンソール画面の表示・非表示モード制御 ***** #deffunc dosdspshow int prm1,int prm2 hDosWin = prm1 : if hDosWin==0 : return -1 nMode = prm2 : if (nMode<=0)|(nMode>1) : nMode=0 if nMode==0 : dspflg=SW_SHOW if nMode==1 : dspflg=SW_HIDE ShowWindow hDosWin,dspflg return 0 ;***** 起動しているコンソール画面を閉じる ***** #deffunc dosclose int prm1 hDosWin = prm1 : if hDosWin==0 : return -1 SendMessage hDosWin,WM_SYSCOMMAND,SC_CLOSE,0 return 0 ;***** コンソール画面のリモート制御モード設定 ***** #deffunc doscmd int prm1,int prm2 hDosWin = prm1 : if hDosWin==0 : return -1 nMode = prm2 : if (nMode<=0)|(nMode>4) : nMode=0 ; OSVERSIONINFO構造体 dim osverinfo,37 : osverinfo(0)=148 GetVersionEx varptr(osverinfo) if osverinfo(4)==2 : OsVerNT=1 : else : OsVerNT=0 dim osverinfo,0 if OsVerNT==0 { ; ●9x系の場合は貼付のみ利用可 repeat 1 if nMode==0 : break if nMode==1 : PostMessage hDosWin,WM_COMMAND,57360,0 : break if nMode==2 : break if nMode==3 : break if nMode==4 : break loop }else{ repeat 1 if nMode==0 : PostMessage hDosWin,WM_COMMAND,65520,0 : break if nMode==1 : PostMessage hDosWin,WM_COMMAND,65521,0 : break if nMode==2 : PostMessage hDosWin,WM_COMMAND,65522,0 : break if nMode==3 : PostMessage hDosWin,WM_COMMAND,65524,0 : break if nMode==4 : PostMessage hDosWin,WM_COMMAND,65525,0 : break loop } return 0 ;***** コンソール画面にキーコードを送信 ***** #deffunc doskeysend int prm1,int prm2,int prm3 nKeyCode1 = prm1 : if (nKeyCode1<=0)|(nKeyCode1>255) : nKeyCode1=0 nKeyCode2 = prm2 : if (nKeyCode2<=0)|(nKeyCode2>255) : nKeyCode2=0 nMode = prm3 : if (nMode<=0)|(nMode>2) : nMode=0 ;***** OSの種別取得 ***** dim os_ver_info,37 : os_ver_info(0)=148 GetVersionEx varptr(os_ver_info) if os_ver_info(4)=2 { lpClassName="ConsoleWindowClass" }else{ lpClassName="tty" } dim os_ver_info,0 FindWindow varptr(lpClassName),0 hDosWin=stat : if hDosWin=0 : return -1 ; ***** ハンドルのみを取得 ***** if nMode==2 : return hDosWin SetForegroundWindow hDosWin ;***** 単独キー送信の場合 ***** if nMode==0 { MapVirtualKey nKeyCode1,0 : convkey=stat keybd_event nKeyCode1,convkey,0,0 keybd_event nKeyCode1,convkey,2,0 } ;***** 同時キー送信の場合 ***** if nMode==1 { MapVirtualKey nKeyCode1,0 : convkey=stat keybd_event nKeyCode1,convkey,0,0 MapVirtualKey nKeyCode2,0 : convkey=stat keybd_event nKeyCode2,convkey,0,0 wait 2 keybd_event nKeyCode1,convkey,2,0 keybd_event nKeyCode2,convkey,2,0 } return hDosWin #global ;***** コンソール画面にキーコードを送信するサンプル (doskeysend.hsp) ***** onexit *owari screen 0,650,120,0,ginfo_dispx-650>>1,(ginfo_dispy-120>>1)+200 sdim ms,1024 font "MS ゴシック",12 : objmode 2 pos 10,4 : input ms,ginfo(10)-80,22 PostMessage objinfo(0,2),EM_SETMARGINS,3,3 objsize 50,22 pos ginfo(10)-68,3 : button "実行", *mode01 objsize 60,24 pos 10,32 : button "非表示",*mode02 pos 72,32 : button "表示", *mode03 pos 134,32 : button "閉じる",*mode04 ;***** コマンドプロンプトを起動 ***** getenvval cp : exec cp wait 10 gosub *dosmove objsize 40,20 pos 205,38 : mes "Left" : pos 245,34 : input x pos 290,38 : mes "Top" : pos 330,34 : input y pos 375,38 : mes "Width" : pos 415,34 : input w pos 460,38 : mes "Height" : pos 500,34 : input h objsize 94,24 pos 544,32 : button "位置サイズ変更",*winposchg pos 10,80 : color 0,0,200 mes "■" pos 24,80 : color 200,0,0 mes "コンソールのコマンドやバッチファイル名、コンソールアプリ名を入力して実行します。" wait 10 actwin hwnd : objsel 0 onkey *kevent stop ;***** Enterキーで実行 ***** *kevent if ms=="" : stop if iparam==13 { objsel -1 : if stat==0 : goto *mode01 } stop ;***** コマンドをクリップボードにセットして送信する ***** *mode01 ;***** ハンドルを再確認して画面が閉じられていたら起動させる ***** gosub *getdoshwnd if hDosWin=-1 : exec cp : wait 50 gosub *getdoshwnd ;***** コマンドをクリップボードにセットしてコンソール画面に貼付ける ***** ls=strlen(ms) : if ls==0 : stop setcliptext ms gosub *clipset wait 10 actwin hwnd : objsel 0 stop ;***** コンソール画面を非表示にする ***** *mode02 gosub *getdoshwnd if hDosWin=-1 : stop dosdspshow hDosWin,1 wait 10 actwin hwnd : objsel 0 stop ;***** コンソール画面を表示する ***** *mode03 gosub *getdoshwnd if hDosWin=-1 : stop dosdspshow hDosWin,0 wait 10 actwin hwnd : objsel 0 stop ;***** コンソール画面を閉じる ***** *mode04 gosub *getdoshwnd if hDosWin=-1 : stop dosclose hDosWin wait 10 actwin hwnd : objsel 0 stop ;***** コンソール画面のサイズ・位置を変更(起動時のみ)***** *dosmove gosub *getdoshwnd if hDosWin=-1 : stop dim rc,4 GetWindowRect hDosWin,varptr(rc) w = rc(2)-rc(0) h = rc(3)-rc(1) x = 0 y = 0 MoveWindow hDosWin,0,0,w,h,1 return ;***** コンソール画面のサイズ・位置を変更 ***** *winposchg gosub *getdoshwnd if hDosWin=-1 : stop MoveWindow hDosWin,x,y,w,h,1 stop ;***** コンソール画面のハンドル取得 ***** *getdoshwnd doskeysend ,,2 : hDosWin=stat return ;***** 貼付処理 ***** *clipset doscmd hDosWin,1 ;▼▼▼ 十分なウェイトを確保して下さい。 ▼▼▼ wait 100 doskeysend 13 return ;***** 終了処理 ***** *owari ;***** 終了時に開いているコンソール画面を閉じる ***** gosub *getdoshwnd if hDosWin!-1 : dosclose hDosWin end
をもともと非表示状態にして、(ここまではできた)
↓このスクリプト
スクリプトはほぼコピペです。
#module ;***** 必要となるAPIや定数の定義 ***** #uselib "kernel32.dll" #cfunc CreateProcess "CreateProcessA" int,sptr,int,int,int,int,int,int,var,var #cfunc WaitForSingleObject "WaitForSingleObject" int,int #cfunc GetEnvironmentVariable "GetEnvironmentVariableA" var,var,int #cfunc CreatePipe "CreatePipe" var,var,var,int #cfunc CloseHandle "CloseHandle" int #cfunc PeekNamedPipe "PeekNamedPipe" int,int,int,int,int,int #cfunc ReadFile "ReadFile" int,var,int,var,int #define SW_HIDE 0 #define SW_SHOW 5 #deffunc consexec var prm1,str prm2 dosexcmd = prm2 : if strlen(dosexcmd)==0 : return -1 #define MAX_PATH 260 sdim cp,MAX_PATH+2 ev="Comspec" ;環境変数(COMSPEC)を設定 ret=GetEnvironmentVariable(ev,cp,MAX_PATH) if ret==0 : return -1 filename=cp+" /c "+dosexcmd ;***** 読み出しバッファを設定 (Max=256KByteに設定) ***** #const MAX_BUF_SIZE 1024*256 sdim szBuf,MAX_BUF_SIZE ;***** 名前なしパイプの作成 ***** sa=12,0,1 : ret=CreatePipe(hRead,hWrite,sa,MAX_BUF_SIZE) ;***** 子プロセスを作成 ***** #define STARTF_USESHOWWINDOW 1 #define STARTF_USESTDHANDLES $00000100 dim lpsiStartInfo,17 ;STARTUPINFO構造体 dim lppiProcInfo,4 ;PROCESS_INFOMATION構造体 lpsiStartInfo(0) = 68 lpsiStartInfo(11) = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW lpsiStartInfo(12) = SW_HIDE lpsiStartInfo(15) = hWrite ret=CreateProcess(0,filename,0,0,1,0,0,0,lpsiStartInfo,lppiProcInfo) if ret==0 : end hprocess=lppiProcInfo(0) ret=WaitForSingleObject(hprocess,$ffffffff) ret=CloseHandle(hWrite) rcvbuf="" repeat await 10 ret=PeekNamedPipe(hRead,0,0,0,dwStdOut,0) ret=ReadFile(hRead,szBuf,4096,dwRead, 0) if dwRead<4096 : memcpy szBuf, szBuf, dwRead, 0, 0 : poke szBuf, dwRead : rcvbuf+=szBuf : break if dwRead==0 : break rcvbuf+=szBuf loop prm1=rcvbuf ret=CloseHandle(hRead) sdim szBuf,0 : sdim cp,0 : sdim rcvbuf,0 return 0 #global ;***** Sample ***** screen 0,640,480,0,ginfo_dispx-640>>1,ginfo_dispy-480>>1 buf="" : consexec buf,"dir" font "MS ゴシック",14 : objmode 2 mesbox buf,ginfo(10)-4,ginfo(11)-24,5 objsel 0 : hCld=objinfo(0,2) objprm 0,buf stop
このスクリプトのように、結果をmesboxに表示したいです。
いろいろいじってみましたが、よくわかりませんでした。
最終的には、inputウィンドウで、コマンド入力して、実行すると、mesboxウィンドウに表示されるみたいな感じにしたいです。
お願いします