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 の状態なのですが、
これを実現する方法があるのであれば、ご教授いただければと思います。
宜しくお願いします。
すみません。
SetWindowPos(frmUpdateList.hwnd, HWND_TOPMOST, 0, 0, 0, 0, _
SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE)
frmUpdateListは質問の中の「From2」のことです。
失礼いたしました。
Fromかよ!
「Form2」のことです・・・。(たびたび申し訳ないです。)
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 だとすんなり
いくかもしれないので割愛します。
単純にForm2を別exeにしてしまってはどうでしょうか
んで、Shellで呼び出してみる
特攻隊長まるるうさん、
参考サイトの提示、ありがとうございます。
SetWindowPos()の引数にSWP_NOOWNERZORDERを追加して試してみたいと思います。
通ってみたさん
Form2はモードレス表示を行いますが、この場合のForm2は、
Form1の補助機能として使うためForm1や共通モジュールが保持している
グローバルな変数を参照するため、別exeにするのはあまり生産的ではないのです。
今のところの情報では、Form2.Show vbModeless では
Form2 > Form1 > IE_1 > IE_2 の状態が回避できないようですね。
いただいたアドバイスの検証に2〜3日要してしまうかも知れません。
検証結果は後日、再度ご報告(&解決チェック付け)に参ります。
SetWindowPos(frmUpdateList.hwnd, HWND_TOPMOST, 0, 0, 0, 0, _
SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE or SWP_NOOWNERZORDER)
で期待の動作を得ることができましたので当質問は解決済みをさせていただきます。
本当にありがとうございました。
ツイート | ![]() |