「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
「Windowを前面に出す」方法については、
過去に似た問い合わせを何回も受けているため纏めておきます。
技術的背景については、「ウィンドウ・システム」を参照のこと。
ウィンドウの制御をプログラムから行う場合は、
SetForegroundWindow?のWin32 APIを使用できますが、
SetForegroundWindow?を使用する場合、以下の様な条件があるようです。
MSDNによると、
- そのプロセスがフォアグラウンドプロセスである。
- そのプロセスはフォアグラウンドプロセスにより開始された。
- そのプロセスが最後の入力イベントを受け取った。
- フォアグラウンドプロセスがない。
- フォアグラウンドプロセスがデバッグ中である。
- フォアグラウンドがロックされていない
(LockSetForegroundWindow? 関数の説明を参照)。- フォアグラウンドロックのタイムアウトが発生している
( 関数の SPI_GETFOREGROUNDLOCKTIMEOUT の説明を参照)。
SetForegroundWindow?でアクティブにならない場合には、
基本的にアクティブにした際(切り替え時)は、タスクバーが点滅するだけですが、~ このウインドウを、最前面に出すのは、以下のような処理が必要になります。
#2360-3 RE#2347:アプリケーションの切替方法について
■ゆー太郎2001-12-03(月) 23:43> SetForegroundWindow を使うのが今までの手法だったのですが、Win98 から OS の > 動作が変わりました。タスクバー上で点滅するのみになります。 > > これは「プログラムが勝手に、前面のウインドウを操作するのはおかしい。」という > 考えを元にしてます。なので、ご希望の動作は、「出来ない/してはならない」こと > になります。(-_-;) > それでも無理やり やりたいのであれば、AttachThreadInput API関数で 無理やり現在アクティなブスレッドに自分のスレッドをアタッチして、 その間にBringWindowToTop API関数で自分のフォームを前面に出します。 その後もう一度AttachThreadInput API関数でデタッチして解除すれば可能です。 もちろん、Windowsの仕様に反しますが。
この処理を「VIQとローカル入出力の統合」と言う。
AttachThreadInput? Win32 APIで、VIQを共有すれば、当該プロセスが、
「そのプロセスが最後の入力イベントを受け取った。」
ということになり、タスクバーを点滅させずに、ウインドウを最前面に出すことができる。
ただし、Windows標準の操作性では無いため、
こちらも基本的にはあまり実装しない方が良い。
Vista以降ではSetWindowPos?のWin32 APIを使用できます。
前述のWin32 APIを使用する必要があるため、IEの場合、
ActiveXを使用する必要があります。javascriptでは実現不可能です。
ただし、起動プロセスのウィンドウを使用して最前面化する必要があります。
マイクロソフトの出しているユーザーエクスペリエンスガイドライン
に、Z order に関する記述があります(P479)。
これによると、他のプロセスのウィンドウを変更するなとあります。
Windows 上のアプリケーションは、このガイドラインに従うべきであり、
Z order は触らない方がイイというコトになります。
Tags: :Windows, :ウィンドウ・システム, :プログラミング