HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1218
koyaコマンドプロンプトをGUI操作+結果をmesbox表示したい2解決


koya

リンク

2013/12/18(Wed) 19:42:07|NO.58796

このスクリプト↓

#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ウィンドウに表示されるみたいな感じにしたいです。
お願いします



この記事に返信する


fortunehill

リンク

2013/12/19(Thu) 03:15:20|NO.58804

/*ご参考に成れば幸いです。(拙作(?)のモジュール群から抜粋した物ですが)*/

#module #uselib "kernel32.dll" #func __GetEnvironmentVariableA "GetEnvironmentVariableA" sptr,sptr,sptr #func __CreatePipe "CreatePipe" sptr,sptr,sptr,sptr #func __CreateProcessA "CreateProcessA" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr #func __WaitForSingleObject "WaitForSingleObject" sptr,sptr #func __PeekNamedPipe "PeekNamedPipe" sptr,sptr,sptr,sptr,sptr,sptr #func __CloseHandle "CloseHandle" sptr #func __ReadFile "ReadFile" sptr,sptr,sptr,sptr,sptr #defcfunc Misc_Pipe str p1,array p2,local ss,local ii,local jj,local hh,local nn,local rr : sdim ss,512 :ss = "COMSPEC" __GetEnvironmentVariableA varptr(ss),varptr(ss),512 : if (stat == 0) {return 0} : jj = 12,0,1 :ss += " /c "+p1 __CreatePipe varptr(hh),varptr(nn),varptr(jj),262144 : dim jj, 17 :ii = 68,0,0,0 : jj(11) = $101,0,0,nn,nn,nn __CreateProcessA 0,ss,0,0,1,0,0,0,varptr(jj),varptr(ii) : if (stat == 0) {return 0} :__CloseHandle ii(1) __WaitForSingleObject ii,-1 :__CloseHandle nn: sdim p2,262144 :await 20 __PeekNamedPipe hh,0,0,0,varptr(jj),0 :__ReadFile hh, varptr(p2),jj,varptr(rr),0 :__CloseHandle hh return rr #global iTxt = "dir" ; mTxt = "" ; gTxt = "" ; :font msmincho,12 :objmode 3 :input iTxt,640-68,24 pos 640-66,0 :button gosub "",*label_1 pos 0,26 :mesbox mTxt,640,480-28,1 stop *label_1 if (Misc_Pipe(iTxt,gTxt)) {objprm 2,gTxt} ;refstrはある大きさを超えると再確保する必要があるので変数で受け取っています。 ;STDERRも同一視して取得しています(awk等のヘルプ) return



koya

リンク

2013/12/19(Thu) 17:04:09|NO.58808

ありがとうございます.
解決しました



ONION software Copyright 1997-2023(c) All rights reserved.