別プログラムから実行したプログラムをモーダルに – プログラミング – Home

別プログラムから実行したプログラムをモ...
 
通知
すべてクリア

別プログラムから実行したプログラムをモーダルに


せと
 せと
(@せと)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

あるプログラムから別の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/ダイアログです。


引用解決済
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

モーダルという単語をどういう意味で使っているか次第になりますが、
例示のプログラムは単に、「別プログラム起動中はハングアップしているだけ」です。
タスクマネージャで見ると無応答になる典型的「行儀悪い」プログラムですね。

具体的にどのように動作すればよいのか、言葉で説明してください。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>WaitForSingleObject(Pi.hProcess,INFINITE);
多分、意図している書き方と違うんじゃないかな?
MSDNの解説を良く見たほうがいいよ


返信引用
せと
 せと
(@せと)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

>具体的にどのように動作すればよいのか、言葉で説明してください。
言葉足らずですみません。
やりたい事としてはメイン画面からボタンの押下により、
PG_A.exeとPG_B.exeを呼び出したいのですが、
仮にPG_Aを実行中は、PG_Aが終了するまで、メイン画面は
アクティブに出来ない様にしたいのです。
(MessageBoxでシステムモーダル属性を付けた感じと言えば良いでしょうか?)
PG_Aが終了したらアクティブになって、ボタンを押下出来るようにしたいと
考えてます。


返信引用
せと
 せと
(@せと)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

自己レスです。

>PG_A.exeとPG_B.exeを呼び出したいのですが、
なんか同時に起動するような書き方ですね。

ボタンが2つあり、それぞれのボタンでPG_AとPG_Bが起動します。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

CreateProcessする前にメインウインドウを無効化して
CreateProcessした後、SetTimerしてOnTimerでWaitForSingleObjectをする。
ただし、タイムアウト10msとかきちんと指定しておこなう。
OnTimerで終了を感知できたらメインウインドウを有効化してKillTimerする。

で何とかなりませんかね。
もしくは終了待ち合わせスレッドを上げてスレッドから終了を通知させるとか。

いずれにしてもメインウインドウ側は能動的に無効化/有効化の切り替えをしないと
駄目でしょう。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました