あるプログラムから別のexeを「モーダル」で呼び出したいと思ってます。
ネットでの情報を参考に以下のソースを書いてみました。
/*------------------------------------------------------
PROCESS_INFORMATION Pi;
STARTUPINFO Si;
memset(&Si,0, sizeof(Si));
Si.cb=sizeof(Si);
CreateProcess(NULL, xxxxx.exe, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &Si, &Pi);
CloseHandle(Pi.hThread);
WaitForSingleObject(Pi.hProcess,INFINITE);
CloseHandle(Pi.hProcess);
------------------------------------------------------*/
確かにモーダルにはなるのですが、呼び出し元の画面が再描画されません。
元の画面も再描画しつつ、モーダルで動かすにはどのようにすれば良いでしょうか?
宜しくお願いします。
あ。環境はVC6/MFC/ダイアログです。
モーダルという単語をどういう意味で使っているか次第になりますが、
例示のプログラムは単に、「別プログラム起動中はハングアップしているだけ」です。
タスクマネージャで見ると無応答になる典型的「行儀悪い」プログラムですね。
具体的にどのように動作すればよいのか、言葉で説明してください。
>WaitForSingleObject(Pi.hProcess,INFINITE);
多分、意図している書き方と違うんじゃないかな?
MSDNの解説を良く見たほうがいいよ
>具体的にどのように動作すればよいのか、言葉で説明してください。
言葉足らずですみません。
やりたい事としてはメイン画面からボタンの押下により、
PG_A.exeとPG_B.exeを呼び出したいのですが、
仮にPG_Aを実行中は、PG_Aが終了するまで、メイン画面は
アクティブに出来ない様にしたいのです。
(MessageBoxでシステムモーダル属性を付けた感じと言えば良いでしょうか?)
PG_Aが終了したらアクティブになって、ボタンを押下出来るようにしたいと
考えてます。
自己レスです。
>PG_A.exeとPG_B.exeを呼び出したいのですが、
なんか同時に起動するような書き方ですね。
ボタンが2つあり、それぞれのボタンでPG_AとPG_Bが起動します。
CreateProcessする前にメインウインドウを無効化して
CreateProcessした後、SetTimerしてOnTimerでWaitForSingleObjectをする。
ただし、タイムアウト10msとかきちんと指定しておこなう。
OnTimerで終了を感知できたらメインウインドウを有効化してKillTimerする。
で何とかなりませんかね。
もしくは終了待ち合わせスレッドを上げてスレッドから終了を通知させるとか。
いずれにしてもメインウインドウ側は能動的に無効化/有効化の切り替えをしないと
駄目でしょう。