- ベストアンサー
外部アプリ(コマンドプロンプト)の制御
こんにちは。プログラミング初心者で申し訳ないのですが、調べてみてもどうしても分からない問題があり、ご質問させて頂きました。お手数をおかけしますがご回答頂ければ幸いです。 windowsアプリケーションにて外部のアプリを呼び出し、それを操作しようとした時に、私のような素人が思いつく方法としては、keybd_eventAPIなどでキーを送る、とかWM_LBUTTONDOWNなどのウィンドウメッセージを送る、くらいしか思いつかないのですが、それ以外に外部操作の方法はあるのでしょうか? 例えば、今私が作ろうとしているのは独自アプリよりコマンドプロンプトを呼び出し、事前に指定したいくつかのコマンドを実行する、といったものなのですが、CreateProcessにて起動し、コマンドプロンプトのハンドルを得たところまでは良かったのですが、そのハンドルを利用してどのようにコマンドを送れば良いのかがどうしても分かりませんでした。 「cd ../」というコマンドを送りたい場合、 Keybd_event(Byte('c'),0,0,0); Keybd_event(Byte('c'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('d'),0,0,0); Keybd_event(Byte('d'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte(' '),0,0,0); Keybd_event(Byte(' '),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('.'),0,0,0); Keybd_event(Byte('.'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('.'),0,0,0); Keybd_event(Byte('.'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('/'),0,0,0); Keybd_event(Byte('/'),0,KEYEVENTF_KEYUP,0); のようなやり方しか思いつかないのですが、他に良い方法はございませんでしょうか? 宜しければご指導して頂けますよう宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (4)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
- nuki
- ベストアンサー率30% (6/20)
- msykykt
- ベストアンサー率35% (15/42)
お礼
ご回答ありがとうございます。 昨日より、教えて頂きましたパイプを使って子プロセスとの通信を行う方法を実装しようと、丸一日悩んだのですが、どうしてもうまくいかず困っております。 以下のような組み方をしているのですが、お時間のある時で結構ですので、もし宜しければご教授お願い致しますm(_ _)m //パイプの標準入出力用ハンドル HANDLE okp_r; HANDLE okp_w; SECURITY_ATTRIBUTES secAtt; //親のプロセスID HANDLE hParent = GetCurrentProcess(); secAtt.nLength = sizeof(SECURITY_ATTRIBUTES); secAtt.lpSecurityDescriptor = NULL; //継承設定 secAtt.bInheritHandle = TRUE; //パイプ作成 CreatePipe(&okp_r,&okp_w,&secAtt,0); //子供は親のWriteハンドルを継承しないように DuplicateHandle(hParent,okp_w,hParent,NULL,0,FALSE,DUPLICATE_SAME_ACCESS); //CreateProcess用の構造体の設定 PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si,sizeof(si)); ZeroMemory(&pi,sizeof(pi)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_SHOW; si.hStdInput = okp_r; si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); //コマンドプロンプトのパス char *cmd_path = getenv("COMSPEC"); //コマンドプロンプト呼び出し if(CreateProcess(NULL, cmd_path, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) { DWORD dw; //実行コマンド char cm[4048]; wsprintf(cm,"dir\r\n"); if(WriteFile(okp_w,cm,strlen(cm),&dw,NULL)) { //成功 }else{ //失敗 } }