オーナーウインドウがアクティブにならないことについて。 メインウインドウにボタンを一つ貼り付け、そのボタンをクリックすると、モーダルダイアログが開くという単純なプログラムがあります。ここでモーダルを閉じるボタンなどで閉じると、モーダルウインドウは破棄され、メインウインドウが再びアクティブになります。いたって普通の挙動です。このときもし、モーダル上にもボタンがあり、そのボタンで更にウインドウが開くといった構造になっていたら、その動作を行った後モーダルを閉じると、メインウインドウはアクティブにならず、他のアプリのウインドウの下などに(もしそれらがあれば)隠れてしまいます。これを防ぐにはどうすれば良いでしょうか。 とりあえず、DialogBoxプロシージャ呼び出しの後に「SetForegroungWindow()」を書けば、見た目上はうまくアクティブになってくれます。ただしモーダルを開いてもそこで更にウインドウを開くことなく、何もせずにただ閉じれば普通にアクティブになってくれるので、その場合には全く無駄なことをやっていることになります。 以下にプログラムを書いておきます。(といってもメインウインドウのボタン・イベントでモーダルを開き、そのモーダルのボタン・イベントで更に何かウインドウを開くというだけのものです。ActiveBasicですが極めて単純なプログラムなので他の言語でもさほど変わらないものと思います。) ActiveBasic Ver.4.24 for Win 32bit============================================メイン・ウインドウのボタン・クリックイベント。Sub MainWnd_CommandButton1_Click() 'モーダル・ダイアログを開く。 DialogBox(hMainWnd, \u0026quot;ModalWnd\u0026quot;) '↓ここでこの命令を書かないと、「モーダルダイアログ上で '何か更にウインドウを開いた時に限り」、その戻りで 'メインウインドウはアクティブにならず、下に隠れる。 'SetForegroundWindow(hMainWnd) End Sub---------------------------------------------モーダル・ダイアログのボタン・クリックイベント。Sub ModalWnd_CommandButton1_Click() '何か更にウインドウを開く。 '(ここでは一例としてメッセージボックス。) MessageBox(hModalWnd, \u0026quot;Yes/No\u0026quot;, \u0026quot;YES/NO\u0026quot;, MB_YESNO) 'ダイアログを閉じる。 EndDialog(hModalWnd, 0)End Sub============================================= 要約すれば、オーナーウインドウにとって、「一段階下のウインドウを開いただけのときには、うまく戻ってこられるが、二段階下のウインドウが一度開かれると元には戻ってこられない」ということになるかと思います。 この現象の解決をお知りの方がおられましたら是非ご教授をお願いしたいと思います。

1件の回答

回答を書く

1046971

2026-08-10 08:05

+ フォロー

.NET C#でWindows FormやWPFでは孫ウィンドウを開いて閉じた後に、親ウィンドウが隠れるための対策を実施した覚えはないです。

ActiveBasicの開発経験はありませんが、上記の理由からActiveBasic固有の動作ではと思います。



ダイアログを開くメソッドで子ウィンドウに親ウィンドウのハンドルを渡しているので、子ウィンドウを閉じた後に親ウィンドウをアクティブにするように記述すればよいように思います。



\u0026gt;モーダル・ダイアログのボタン・クリックイベント。

Sub ModalWnd_CommandButton1_Click()



'何か更にウインドウを開く。

'(ここでは一例としてメッセージボックス。)

MessageBox(hModalWnd, \u0026quot;Yes/No\u0026quot;, \u0026quot;YES/NO\u0026quot;, MB_YESNO)



'ダイアログを閉じる。

EndDialog(hModalWnd, 0)

'\u0026gt;\u0026gt;親ウィンドウを最前面に設定する

SetForegroundWindow(hMainWnd)



End Sub





また、メインウィンドウの

Sub MainWnd_CommandButton1_Click()

'SetForegroundWindow(hMainWnd)

End Sub

で動作に支障がなければ無駄なコードに見えてもそれでよしという解決もあると思います。

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有