• ベストアンサー

モードレスダイアログをクリックして親を表示したくない

初めまして。 VC++ win32で開発をしていますが、 モードレスダイアログをCreateDialogで作成し、ShowWindow(TRUE)で表示後、 他のアプリケーションを別プロセスで使用しているときにTOPMOSTで表示している上記ダイアログをクリックすると、親のウィンドウが表示されてしまいます。 これを抑止することはできないのでしょうか。 C#.NETだとできるようなのですが。 よろしくお願いいたします。

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

  • ベストアンサー
回答No.2

 こんばんは。  モードレスダイアログの親ウィンドウをNULLにするかGetDesktopWindow()にして見ては如何でしょう。  HWND hDlg = ::CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), ::GetDesktopWindow(), &::DlgProc);  又は  HWND hDlg = ::CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, &::DlgProc);

blackcoata
質問者

お礼

machongolaさん、ご回答ありがとうございました。 教えていただいた方法で、CreateDialog時に親をNULLにする方法でうまくいきました。 すごく悩んでいたので大変助かりました。 どうもありがとうございました。

その他の回答 (1)

  • hiochi
  • ベストアンサー率50% (1/2)
回答No.1

>他のアプリケーションを別プロセスで使用しているときに >TOPMOSTで表示している上記ダイアログをクリックすると、 >親のウィンドウが表>示されてしまいます。 もう少し各文言に主語をつけて書いていただくと的確にアドバイスできると思いますが、とりあえず私の読み取った内容でお答えしますね。 モードレスダイアログは元々親ウインドウが前に出るため、支障がなければDialogboxでモーダルダイアログで作成すれば親ウインドウが前にでることはなくなるでしょう。 また、(たとえばタスクマネージャのように)常時最前面に出すためにのが目的でしたら、少し面倒な処理が必要になります。 その処理も状況によって方法が違いますので、もう少し詳細な内容がわかればアドバイスできるかもしれません。

blackcoata
質問者

補足

お返事ありがとうございます。 つたない質問で大変失礼いたしました。 やろうとしていたのは、 1.タスクマネージャーのような、常時TOPMOSTのモードレスダイアログを表示する。ダイアログはCreateDialog()で生成。ShowWindow(SH_SHOW)で表示。 2.他のアプリケーション(例えばExcel)を起動する。このときもダイアログは表示されている。 3.モードレスダイアログをクリックする。 4.ダイアログの親ウィンドウが表に出てきてしまう。 上記の4を抑止しようとしていました。 やっぱりダイアログでは無理なのでしょうか。

関連するQ&A

  • モードレスダイアログ

    お世話になっております。 VC2005を使用しております。 メインウィンドウの他にモードレスダイアログを常時表示させたいと 考えております。 ダイアログのプロパティのTopmostをTrueにすると常時手前に表示されるのですが、メインウィンドウを最小化したり、他のプログラムを起動した時も常に前面に表示されてしまいます。 メインウィンドウと同じように動作するにはどうすればよいのでしょうか?教えてください。 よろしくお願いします。

  • モードレスダイアログについて

    いつもお世話になっています。 WIN98 VC++6.0 MFC モードレスダイアログにおいて、 子ダイアログが表示されていても親ダイアログの操作が出来ますが、親ダイアログを子ダイアログの前に持ってくるにはどうすれば良いのでしょうか?

  • 複数のモードレスダイアログを表示したい

    開発環境 Windows XP Visual C++6.0 親ウインドウの、メニューから複数のモードレスダイアログを 表示しようとしています。 <ソースの抜粋> void CSmp1View::OnDialog1() { static Modaless aaa; static tagRECT bbb; aaa.Create(NULL,"Moderess",NULL, bbb ,this,IDD_DIALOG1,NULL); aaa.ShowWindow(SW_SHOW); } モードレスダイアログは、表示できるのですが 2つ目のダイアログを表示しようとすると 異常終了します。 また、1つめのダイアログを終了してから、メニュバーから モードレスダイアログを表示しようとしても 同じエラーで異常終了します。 また、任意のモードレスダイアログを閉じたときに 何か気をつけることがあるでしょうか? 参考コードなどがありましたら ご教授ください。 よろしくお願いします。

  • VC++でモードレスダイアログ

    突然で申し訳ありません。 VC++でアプリケーションを作成しているのですが、 メインフレームからモードレスダイアログを表示するまではよかったのですが、モードレスダイアログボックスの裏に隠れたメインフレームをどうやっても表に表示できません。リソースファイルでの設定がいろいろあるようで、やってみたのですが、うまくいきません。 どなたか知っている方がいらっしゃいましたら、無知な私にご教授願えないでしょうか。 宜しくお願いいたします。 因みにダイアログのプロパティは 「タイトルバー」と「システムメニュー」をチェックしてあるだけです。。。。。 お願いします。

  • モードレスダイアログ ボックスの破棄について

    はじめまして。 VC++6.0でアプリケーションを開発していますが、モードレスダイアログの破棄の事で困っています。 まずアプリケーションの状況から説明します。 メインフレームを親として、複数の子ダイアログボックスが大量にある状態です。 1つのプロセスで使用している画面数、コントロール数とも膨大な為、子ダイアログを使うたびに作成→破棄(メモリの解放)を繰り返すようにしたいと思っています。 Create 関数で作成したダイアログ ボックスを破棄するには、CWnd::DestroyWindow 関数を使えばいいようですが、この関数を使用すればメモリの解放もされているのでしょうか? タスクマネージャを見る限り、メモリの使用量は減っていないようなのですが・・・ NSDNなどで色々調べたのですが、CWnd::PostNcDestroy関数も合わせて使用し、delete this としないとメモリの解放は出来ないのかどうかが、いまいち良く分かりません。 残り時間がほとんどなく、本当に困っています。 どなたかよろしくお願いいたします。

  • モードレスダイアログのキー入力について

    VC++6.0で親ダイアログで作成した子ダイアログをモードレスで表示しています。(ShowWindowで表示した後、子ダイアログが終了するまでループ) 両方のダイアログに、OKボタンとキャンセルボタンしかない時には、リターンキー・ESCキーを押せば子ダイアログが終了していました。(親ダイアログにフォーカスがあるときには親ダイアログが終了) ところが、子ダイアログが表示されている間、親ダイアログ上でプログレスバーを表示・更新ようにしたら、とたんにリターンキー・ESCキーが効かなくなり、マウスのクリックでしか終了することができなくなりました。 WEBで調べてPreTranslateMessageを追加して、この関数にブレイクポイントを設定しましたが、呼ばれている様子がありません。 子ダイアログをマウスのボタンクリックで終了させた後は、親ダイアログのPreTranslateMessageでイベントが取得できます。 何をどうしたらリターンキー・ESCキーのイベントが取得できるようになるのでしょうか?

  • ダイアログの表示、非表示の切り替えについて

    環境 WIN98 VC++6.0 MFC SDIにて 1.ポップアップメニューの”ダイアログ作成”をクリックすると、 void CMainFrame::OnKNew() { CInput dlg; int iID = dlg.DoModal(); } として、ダイアログを作成します。 2.次に、ダイアログのボタン押し下げにてダイアログを非表示にします。 void CInput::OnButton1() { ShowWindow(SW_HIDE); } このようなコードにおいて、非表示状態での”ダイアログ作成”クリックでは非表示から表示に切り替えることを実現するにはどのようにすれば良いのでしょうか? よろしくお願いいたします。

  • WPFでのモーダル/モードレスダイアログの同時操作

    WPFでメインウインドウからモードレスダイアログとモーダルダイアログを表示し、 それぞれのダイアログに対して操作をしたいと思っています。 1.メインウインドウのボタンをクリックしてモードレスダイアログを表示 2.メインウインドウのボタンをクリックしてモーダルダイアログを表示 上記2の処理を行うと、上記1で表示したモードレスダイアログが一切操作を受け付けなく なるのですが、対応方法はありますでしょうか? 仕様上、片方のダイアログは必ずモーダル表示にします。 ソースコードは以下のような感じです。 private Window2 window2; private void button1_Click(object sender, RoutedEventArgs e) { window2 = new Window2(); window2.Show(); } private void button2_Click(object sender, RoutedEventArgs e) { Window window3 = new Window3(); window3.ShowDialog(); } よろしくお願いいたします。

  • ダイアログの再表示について

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、 生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_left=100; pWnd->m_top=100; m_pAryDlg.Add ( pWnd ); //m_pAryDlg2.Add ( &m_InputData ); pWnd->m_moji=m_InputData; pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログが非表示から 表示になるように以下のコードを書きましたが、表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point)  //ウィンドウのダブルクリック { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

  • フォームの再表示について

    VC++初心者です。 ダイアログベースのアプリケーションをつくったんですが、その後ボタンクリックでモーダルダイアログを2つ順番に表示したいと思っています。 void CMFC_testDlg::OnBnClickedButton1() {   CmyDialog myDL;   ret1 = myDL.DoModal(); } で一つ目を表示 void CmyDialog::OnBnClickedOk() {   this->ShowWindow(SW_HIDE);   CmyDialog02 myDL02;   myDL02.DoModal(); } で一つ目を隠して、2つ目を表示 さらに2つ目のダイアログのボタンを押した時、2つ目を閉じて1つ目を再表示したいと思います。 void CmyDialog02::OnBnClickedOk() {   EndDialog(-1);   CmyDialog::ShowWindow(SW_SHOW); } と書いた所エラーになります。 どこがまずいんでしょうか。 エラーメッセージ:静的でないメンバ関数の呼び出しが正しくありません VBになれてしまっているため、C++の文法でどう書いていいのかわかりません。 どなたかお教えください。

専門家に質問してみよう