Form.Show vbModeless の際、オーナーフォームを前面に出さないようにするには?

解決


パンダ  2005-11-28 20:59:29  No: 92959

VB6.0です。

ウィンドウが3枚あるとします。
最下部と最前面のウィンドウは他のアプリケーション(なんでも良いですが仮にIEとします。)のウィンドウとし、真ん中に自プログラムのフォーム(Form1)があるとします。
IE_1  >  Form1  >  IE_2      ※>であるほど前面のつもり

この状態で、Form1に乗っかっているTimerオブジェクトのTimerイベントにより、Form2に対して
Form2.Show vbModeless
というメソッドを実行すると、当然、Form2が最前面に表示されますが、
オーナーフォームであるForm1も同時に前面に移動してしまいます。
Form2  >  Form1  >  IE_1  >  IE_2  の状態

対策として、
SetWindowPos(frmUpdateList.hwnd, HWND_TOPMOST, 0, 0, 0, 0, _
            SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE)
を試してみましたが、同様の結果となってしまいます。

それぞれの変数(定数)の定義は、
Private Const HWND_TOPMOST = (-1)
Private Const SWP_SHOWWINDOW = &H40&
Private Const SWP_NOSIZE = &H1&
Private Const SWP_NOMOVE = &H2&
としています。

期待する動作としてはForm2だけを最前面にする
Form2  >  IE_1  >  Form1  >  IE_2  の状態なのですが、
これを実現する方法があるのであれば、ご教授いただければと思います。
宜しくお願いします。


パンダ  2005-11-28 21:02:02  No: 92960

すみません。
SetWindowPos(frmUpdateList.hwnd, HWND_TOPMOST, 0, 0, 0, 0, _
            SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE)

frmUpdateListは質問の中の「From2」のことです。
失礼いたしました。


パンダ  2005-11-28 21:03:26  No: 92961

Fromかよ!
「Form2」のことです・・・。(たびたび申し訳ないです。)


特攻隊長まるるう  2005-11-29 23:13:57  No: 92962

http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_setwindowpos.asp
>SWP_NOOWNERZORDER   オーナーウィンドウの Z オーダーを変更しません。 
ではないでしょうか?

予備知識ですが、『フォアグラウンドウィンドウ』については
OSによって制限がある場合があります。で、OSによって動作が変わることもあります。
http://madia.world.coocan.jp/vb/vb_bbs2/200402_04020031.html
http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_setforegroundwindow.asp
↑[解説]の
>Windows 98、Windows 2000:
あたり。で、SWP_NOOWNERZORDER を指定してもオーナーフォームの
フォアグラウンド命令は有効なのか FlashWindowEx によるフラッシュは
あるみたいです。(Win2000(Sp4)で確認)
SetWindowPos の解説に
>フォアグラウンドでないアプリケーションをフォアグラウンドにするには、SetForegroundWindow 関数を呼び出さなければなりません。
という記述もあり、考えないといけないかもしれないですが、Xp だとすんなり
いくかもしれないので割愛します。


通ってみた  2005-11-30 02:59:14  No: 92963

単純にForm2を別exeにしてしまってはどうでしょうか
んで、Shellで呼び出してみる


パンダ  2005-11-30 11:40:22  No: 92964

特攻隊長まるるうさん、
参考サイトの提示、ありがとうございます。
SetWindowPos()の引数にSWP_NOOWNERZORDERを追加して試してみたいと思います。

通ってみたさん
Form2はモードレス表示を行いますが、この場合のForm2は、
Form1の補助機能として使うためForm1や共通モジュールが保持している
グローバルな変数を参照するため、別exeにするのはあまり生産的ではないのです。

今のところの情報では、Form2.Show vbModeless  では
Form2  >  Form1  >  IE_1  >  IE_2  の状態が回避できないようですね。
いただいたアドバイスの検証に2〜3日要してしまうかも知れません。
検証結果は後日、再度ご報告(&解決チェック付け)に参ります。


パンダ  2005-12-01 21:15:26  No: 92965

SetWindowPos(frmUpdateList.hwnd, HWND_TOPMOST, 0, 0, 0, 0, _
            SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE or SWP_NOOWNERZORDER)

で期待の動作を得ることができましたので当質問は解決済みをさせていただきます。
本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加