こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【VC2005】外部から呼ばれた複数のVCのEXEからそれぞれ1つのみのダイアログを出す方法

VC超超初心者です。

タイトルの件、今までうんうん考えましたが、独力では厳しいので
よい知恵(コーディング)を教えて頂けませんでしょうか?
************************************************
やりたいこと:
・プログラムAから、ShellExecute()を利用して、プログラムBを
 複数起動します。(現在、このプログラムBをコーディング中です。)
・プログラムBにあるボタンを押して、
 1つだけのダイアログCを出力させたいです。
(呼び出し元のプログラムBから自分の呼び出したダイアログCを
 操作(拡大、閉じるなど)をしたいです。)

条件:
・プログラムBはモードレスでダイアログCを呼び出したいです。
・プログラムBがダイアログCを既に呼び出していれば、ボタンをクリック
 してもカウントせず、新たにダイアログCはつくりません。
 (プログラムBの他のボタンは有効とします。)
・プログラムBで自分の呼び出したダイアログCが閉じられれば、
 再度ボタンを押して、ダイアログCを呼び出せます。
・複数のプログラムBが起動している場合、プログラムBは自分が
 呼び出したダイアログCのみをコントロールします。
************************************************

私の環境
・OS:WindowsXP pro
・VC2005 Express Edition
・プロジェクト種類:CLR

お手数ですが、詳しい方いましたら、ご協力お願いします。

投稿日時 - 2009-04-03 20:30:54

QNo.4850203

すぐに回答ほしいです

質問者が選んだベストアンサー

そのアプリケーション構成では制御できないと思いますよ

ダイアログのモーダル/モードレスは1つのアプリの中で完結します

> 複数の画面に表示したい
というのが Windowsのマルチディスプレイが対象なのなら
『ダイアログC』の表示位置の調整で済む話だと思います

アプリケーション
 ダイアログB
 ダイアログC
といった構成で制御したほうが確実なように思います

投稿日時 - 2009-04-06 12:57:29

お礼

ご回答ありがとうございます。
再考します。

投稿日時 - 2009-04-09 09:55:33

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

逆でしょ
『モーダル』で呼び出したダイアログはそのダイアログを閉じない限り
呼び出しもとの操作ができない

といった制約を受けます

『モードレス』で呼び出だしたダイアログはダイアログを閉じなくても呼び出しもとの操作は可能です

モーダル/モードレスは1つのアプリの中でダイアログを使用している場合に該当すると思われます

プログラムBとプログラムCが別アプリ(EXE)なら
モーダル/モードレスは無関係になると思いますよ

プログラムCがDLLなら話は別でしょうが ...

拡大、閉じるなどの具体的な操作はその『プログラムC』の作り次第です
拡大がWM_SIZEメッセージでいいなら
プログラムC』のウィンドウハンドルを取得して
WM_SIZEメッセージを SendMessageなどで送ってやればいいように思い
ます

閉じるも WM_CLOSEを送ってやればいいのかも

『プログラムC』の起動の管理は起動したのかどうかのフラグでの制御と
EnumWindowsによる既存の起動アプリの列挙でカウントするなどの工夫が必要でしょう

投稿日時 - 2009-04-03 23:07:43

補足

ご回答、ありがとうございます。
最初に回答してくださった方に申し上げたように、
私のしたいことは正しいと思います。

何故このようなことをしたいかといいますと、
将来PCに2台のディスプレイを接続して、
ディスプレイXの画面にプログラムBを
ディスプレイYの画面をダイアログCを
表示したいと考えているため、今回の質問をさせて頂きました。

ディスプレイYは大画面モニタでこれのみを
大衆に見せるようなことをしたいのです。

投稿日時 - 2009-04-05 22:59:00

ANo.1

>・プログラムBはモードレスでダイアログCを呼び出したいです。

>(呼び出し元のプログラムBから自分の呼び出したダイアログCを
> 操作(拡大、閉じるなど)をしたいです。)
>・プログラムBがダイアログCを既に呼び出していれば
>(プログラムBの他のボタンは有効とします。)
>・複数のプログラムBが起動している場合、プログラムBは自分が
> 呼び出したダイアログCのみをコントロールします。
は矛盾します。

モードレスでウィンドゥを呼び出し中のプログラムBは「モードレスで開いたウィンドゥを閉じない限り、制御がプログラムBに戻らない」ので「ダイアログCが開いている限り、プログラムBは何も出来ない」です。

「プログラムBは何も出来ない」ので、ダイアログCをコントロールしたり、拡大したり、閉じたりする事は出来ません。

「モードレスでウィンドゥを呼び出し中は、プログラムが完全に停止」します。プログラムBがフォーカスを受け取って自身のウィンドゥをアクティブにする事さえも出来ません。

ウィンドゥをアクティブにする事が出来ないですから「他のボタンが有効になっていても、押す事もできない」ので、他のボタンを有効にしても無意味です。

投稿日時 - 2009-04-03 22:24:13

補足

ご回答、ありがとうございます。
しかしながら、私の実現したい事は、質問内容のとおりで
あっていると思いますが、慣れない「モーダル」とか「
モードレス」という言葉を使用したため
誤解を与えてしまったのかも知れません。申し訳ございません。

「モーダル」でダイアログC呼び出すと、プログラムBの操作は無効になり、
ダイアログCが閉じられて、初めてプログラムB再操作可能と認識してます。
また、「モードレス」でダイアログC呼び出すと、プログラムBの操作は有効で、
ダイアログCも操作可能だと認識してます。

私のしたいことのイメージはプログラムBからダイアログCを1つのみ作成して、
それをプログラムBからダイアログCを操作(ダイアログCの画面を拡大、閉じる、ラベル名の変更など)を行いです。
だから、ダイアログCが開いていても、プログラムB上のボタンは有効に
なってないといけないと思うのですが、、、

投稿日時 - 2009-04-05 22:39:20