• ベストアンサー

【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 お手数ですが、詳しい方いましたら、ご協力お願いします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

そのアプリケーション構成では制御できないと思いますよ ダイアログのモーダル/モードレスは1つのアプリの中で完結します > 複数の画面に表示したい というのが Windowsのマルチディスプレイが対象なのなら 『ダイアログC』の表示位置の調整で済む話だと思います アプリケーション  ダイアログB  ダイアログC といった構成で制御したほうが確実なように思います

yuki7091
質問者

お礼

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

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

逆でしょ 『モーダル』で呼び出したダイアログはそのダイアログを閉じない限り 呼び出しもとの操作ができない といった制約を受けます 『モードレス』で呼び出だしたダイアログはダイアログを閉じなくても呼び出しもとの操作は可能です モーダル/モードレスは1つのアプリの中でダイアログを使用している場合に該当すると思われます プログラムBとプログラムCが別アプリ(EXE)なら モーダル/モードレスは無関係になると思いますよ プログラムCがDLLなら話は別でしょうが ... 拡大、閉じるなどの具体的な操作はその『プログラムC』の作り次第です 拡大がWM_SIZEメッセージでいいなら プログラムC』のウィンドウハンドルを取得して WM_SIZEメッセージを SendMessageなどで送ってやればいいように思い ます 閉じるも WM_CLOSEを送ってやればいいのかも 『プログラムC』の起動の管理は起動したのかどうかのフラグでの制御と EnumWindowsによる既存の起動アプリの列挙でカウントするなどの工夫が必要でしょう

yuki7091
質問者

補足

ご回答、ありがとうございます。 最初に回答してくださった方に申し上げたように、 私のしたいことは正しいと思います。 何故このようなことをしたいかといいますと、 将来PCに2台のディスプレイを接続して、 ディスプレイXの画面にプログラムBを ディスプレイYの画面をダイアログCを 表示したいと考えているため、今回の質問をさせて頂きました。 ディスプレイYは大画面モニタでこれのみを 大衆に見せるようなことをしたいのです。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.1

>・プログラムBはモードレスでダイアログCを呼び出したいです。 と >(呼び出し元のプログラムBから自分の呼び出したダイアログCを > 操作(拡大、閉じるなど)をしたいです。) >・プログラムBがダイアログCを既に呼び出していれば >(プログラムBの他のボタンは有効とします。) >・複数のプログラムBが起動している場合、プログラムBは自分が > 呼び出したダイアログCのみをコントロールします。 は矛盾します。 モードレスでウィンドゥを呼び出し中のプログラムBは「モードレスで開いたウィンドゥを閉じない限り、制御がプログラムBに戻らない」ので「ダイアログCが開いている限り、プログラムBは何も出来ない」です。 「プログラムBは何も出来ない」ので、ダイアログCをコントロールしたり、拡大したり、閉じたりする事は出来ません。 「モードレスでウィンドゥを呼び出し中は、プログラムが完全に停止」します。プログラムBがフォーカスを受け取って自身のウィンドゥをアクティブにする事さえも出来ません。 ウィンドゥをアクティブにする事が出来ないですから「他のボタンが有効になっていても、押す事もできない」ので、他のボタンを有効にしても無意味です。

yuki7091
質問者

補足

ご回答、ありがとうございます。 しかしながら、私の実現したい事は、質問内容のとおりで あっていると思いますが、慣れない「モーダル」とか「 モードレス」という言葉を使用したため 誤解を与えてしまったのかも知れません。申し訳ございません。 「モーダル」でダイアログC呼び出すと、プログラムBの操作は無効になり、 ダイアログCが閉じられて、初めてプログラムB再操作可能と認識してます。 また、「モードレス」でダイアログC呼び出すと、プログラムBの操作は有効で、 ダイアログCも操作可能だと認識してます。 私のしたいことのイメージはプログラムBからダイアログCを1つのみ作成して、 それをプログラムBからダイアログCを操作(ダイアログCの画面を拡大、閉じる、ラベル名の変更など)を行いです。 だから、ダイアログCが開いていても、プログラムB上のボタンは有効に なってないといけないと思うのですが、、、

関連するQ&A

  • 【VC++2005(CLR)】ダイアログ呼び出し元ダイアログを手前に表示させたい

    VC++初心者です。 現在、VC++ express edition、CLRプロジェクトでコーディングしております。 いろいろな方の力を借りて、モードレスでダイアログ(子ダイアログ)を 呼び出しだすことができました。ありがとうございました。 しかしながら、常にその子ダイアログが呼び出し元ダイアログ(親ダイアログ)の手前に 表示されてしまいます。 各ダイアログがクリックされるたびに、クリックされたダイアログが手前に表示する ようにできませんでしょうか。 よろしくお願いします。

  • 【VC++6.0】外部exeを2つだけ起動させたいのですが・・・

    現在VC++6.0を使用して、外部exeを起動させようとしていますが、 なかなかうまくいきません。 詳しい方いましたら、具体例を踏まえて教えて頂けませんでしょうか?? (本当にお願いします。) (私自身、C言語はなんとなくわかっているつもり(学生レベルの下)  ですが、VC++になって現在更に混乱しています。) (返事はちょっと遅れますが、必ずしますのでお願いします。) ************************************************************** 【やりたいこと(例で紹介します)】 ・ボタンを押して、1つのcalc.exeを立ち上げられるようにします。 ・更にボタンを押せば、calc.exeが2つまで立ち上がることは許可します。(3つ以上はだめ) ・立ち上がっていたcalc.exeが一度終了し、更にボタンを押せば、  クリックの回数分上限2つまでcalc.exeを立ち上げます。 【条件】 ・2つまでcalc.exeが立ち上がっていれば、ボタンを押したことをカウントしないとします。 ・起動もとのVC++のプログラム上の他のボタンは有効とします。 ************************************************************** 私の環境: Windows XP proで、VC++6.0を利用してます。 希望: ・できれば、Shellexecuteを使いたいです。 ・プロセスはあまり・・・(ネットで具体例をみましたが、全く使いこなせませんでした。) 以上、よろしくお願いします。

  • 【VC2005(CLR)】モードレスで呼んだダイアログの閉じ方

    VC2005初心者です。 現在CLRのプロジェクトでコーディングしてますが、 モードレスで呼んだダイアログの閉じ方が分かりません。 ご存知の方、よろしくお願いします。 ちなみに自分自身のダイアログを閉じるのは this->Close(); なので、以下のように書いたのですが、閉じてくれません。 ※showFlag = 0;を大域変数で宣言しておきます。 AAA^ formAAA = gcnew AAA(); if(showFlag ==0){ AAA^ formAAA = gcnew AAA(); formAAA->Show(this); showFlag = 1; } else{ formAAA->Close(); showFlag = 0; }

  • 【VC++2005(CLR)】ダイアログ右上の最小化、最大化、閉じるボタンの制御の仕方を教えてください。

    VC++初心者です。 たびたび、お世話になっております。 現在、VC++2005 Express Edition、CLRのプロジェクトで コーディングしています。 基本的な質問だと思いますが、ダイアログ右上に配置される 最小化、最大化、閉じるボタンの制御の仕方を 教えていただけませんでしょうか。 具体的にはやりたいことは、以下のようなものです。 ・閉じるボタンを押されたら、MessageBoxを表示させる。 ・他のダイアログのボタンから別のダイアログの最大化ボタンが  押されたことと同じ動作をする。

  • 【VC++2005(CLR)】1つのダイアログに複数のまとまったデータ群を載せたい

    VC++初心者です。 現在、CLRのプロジェクトでコーディングしています。 表題の件について、具体的にどのように設計していけばよいのか (画面設計で利用したほうがよいフォームの種類など) ご教授いただきたくお願いします。 (どんな方針で設計していけばよろしいでしょうか) (主に画面設計について伺いたいです。) やりたいことはこんなイメージの内容です。 *********************** ・1つのダイアログに複数の外国為替のデータを載せたい。 ・1つの国が持つデータは、その国の国旗画像データ、その日の最高値、最安値、平均値、現在値を表示させたい ・1つのダイアログに、20国のうち1~4つの国のデータを表示させたい。 ・1国表示なら、ダイアログ全体にさせたい ・2国表示なら、そのダイアログの上下にさせたい ・3,4国表示なら、上下左右を4分割させて表示させたい。 *********************** (画面設計では、Panelを使って国ごとに1つずつ割り当てて  あげればいいのかな、などと考えていますがどうでしょうか。  参考になるページを教えていただけると幸いです。)

  • VC++6.0で複数の外部プログラムを起動 / 終了させる

    現在、VC++6.0でプログラムを起動時にINIファイルに 記述されたパスから複数の外部プログラムを起動して、 プログラムの終了時にその起動したプログラムをすべて 終了させるプログラムを作成しようとしているのですが 良い処理方法が思い浮かびません。 いろいろ調べている内に以下のようなページは見つけ ました。 http://www.asahi-net.or.jp/~yy6m-wd/kuma/vctip/proces.htm#terminate 下の二行をWM_DESTROYで処理させることにより一つの プログラムなら終了させることは出来ました。 これを複数回行う方法はないものでしょうか? (WM_CREATEで複数のプログラムを起動して起動した すべてのプロセスの終了コードを取得する方法) リスト構造体に格納しようとしましたがなぜか強制終了 してしまいます。(^_^; あと、ShellExecute関数のように起動したプログラムを 最前面に表示させないこと(アクティブにさせない)は できませんか? (SW_SHOWNOACTIVATEかSW_SHOWNA) もしかするとSTARTUPINFO 構造体で指定できそうな 感じですが・・・。 よろしくお願いします。

  • MFC、ダイアログベースでのモードレス作成

    現在、MFCで検索プログラムを作成しています。 始めはDoModalで作成していたのですが、ダイアログを閉じずに、ダイアログを複数並べて見たいという意見が出た為、モードレスで作成し直そうとしたところ、ダイアログが現れてくれません。 インターネットで見つけたソースを試してみたのですが、上手くいきません。 どなたか教えて頂けますか? =ダイアログに移るボタンコードに= CDlg1 dlg; dlg.Create(IDD_DIALOG1, this); dlg.ShowWindow(SW_SHOW); (dlg.DestroyWindow();は他に記述) 1. 上記では、ShowWindowに0が返ってしまい、一瞬ダイアログが映って 消えてしまいます。Createは1が返ってるのでいいかと思いますが…。 2. あと、違うソースで試したところ、ダイアログは表示できるものの、 一回消してしまうと、もう一度ボタンを押しても再度は表示されません。 しかも、Destroy()を設定したOKボタンでは強制終了となってしまいます。 モードレスで作成すると、一回そのダイアログを消してしまうと再度表示ができないのでしょうか? モードレスってただ他の処理ができるというだけで、そのダイアログを何枚も表示させておくことはできないのでしょうか? 3. このダイアログにjpegファイルを表示させているのですが、ダイアログベース・htmlView以外で表示させれる方法がありましたら教えて下さい。 よろしくお願いします。

  • VC++のダイアログベースアプリケーションのボタンについて

    開発環境:WinXP(Home) + Visual C++6.0 Enterprise こんにちは。VC++にてダイアログベースのアプリケーションを開発しております。 VC++に関しては数年ぶりなのですっかり忘れておりまして、入門書から読んでおります。プログラミング歴自体は15年程度になります。 ダイアログベースのアプリケーションのスケルトンを作って、すぐに実行させると、一番下にOK,キャンセル,適用,ヘルプというボタンが出ます。 これらのボタンをすべて消したいのですが、どうしたらいいのでしょうか? リソースを見てもないので、困っております。 どなたかご教授お願い致します。

  • 【VC++2005(CLR)】ファイルが他で使用されていると、落ちてしまう

    VC++初心者です。 現在、VC++2005 express edition、CLRプロジェクトでコーディングしております。 質問のタイトルをもう少し具体的に説明しますと、 あるファイルを開きっぱなしにして、 そのファイルを読みにいこうとするとプログラムが落ちてしまいます。 これを回避するにはどうしたら宜しいでしょうか? もし、読みたいファイルが使用中でも、使用終了されたら、 すぐにそのファイルを読みに行くことは可能でしょうか? お手数ですが、よろしくお願いします。

  • VC++でダイアログボックスを表示させるプログラム

    VC++のプログラミングで、実行できない原因が 判らないので、ヒントをいただけないでしょうか。 現在VC++の勉強中で、ダイアログボックスを 表示するプロジェクトを作成しています。 ビルドエラーは出ないのですが、実行しても 何も表示されません。 メニューを持った親ウインドウを表示し、 メニューから「加算」を選択すると 計算用のダイアログボックスが表示されるプログラムです。 ダイアログボックスは三個のテキストボックスと 二個のボタンがあり、数字を二箇所入れ ボタンを押すと計算結果を表示します。 長くなる為ソースは書けないのですが、 こういう場合まず何からチェックすればいいでしょうか? 初心者なのでちょっとしたことで間違えているかも しれません。どなたかアドバイス下さい。

専門家に質問してみよう