マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

「Windowを前面に出す」方法については、
過去に似た問い合わせを何回も受けているため纏めておきます。

技術的背景については、「ウィンドウ・システム」を参照のこと。

SetForegroundWindow?

ウィンドウの制御をプログラムから行う場合は、
SetForegroundWindow?のWin32 APIを使用できますが、

使用条件

SetForegroundWindow?を使用する場合、以下の様な条件があるようです。

MSDNによると、

  1. そのプロセスがフォアグラウンドプロセスである。
  2. そのプロセスはフォアグラウンドプロセスにより開始された。
  3. そのプロセスが最後の入力イベントを受け取った。
  4. フォアグラウンドプロセスがない。
  5. フォアグラウンドプロセスがデバッグ中である。
  6. フォアグラウンドがロックされていない
    LockSetForegroundWindow? 関数の説明を参照)。
  7. フォアグラウンドロックのタイムアウトが発生している
    ( 関数の SPI_GETFOREGROUNDLOCKTIMEOUT の説明を参照)。

AttachThreadInput?

SetForegroundWindow?でアクティブにならない場合には、
AttachThreadInput? API関数を呼び出した後にBringWindowToTop? API関数を呼び出す。

補足説明(VIQとローカル入出力の統合)

この処理を「VIQとローカル入出力の統合」と言う。

AttachThreadInput? Win32 APIで、VIQを共有すれば、当該プロセスが、

「そのプロセスが最後の入力イベントを受け取った。」

ということになり、タスクバーを点滅させずに、ウインドウを最前面に出すことができる。

ただし、Windows標準の操作性では無いため、
こちらも基本的にはあまり実装しない方が良い。

Vista以降(SetWindowPos?

Vista以降ではSetWindowPos?のWin32 APIを使用できます。

Webからだと(ActiveX)

前述のWin32 APIを使用する必要があるため、IEの場合、
ActiveXを使用する必要があります。javascriptでは実現不可能です。

その他

常に最前面

起動時だけ最前面

ただし、起動プロセスのウィンドウを使用して最前面化する必要があります。

Windowsの標準仕様

マイクロソフトの出しているユーザーエクスペリエンスガイドライン

に、Z order に関する記述があります(P479)。

これによると、他のプロセスのウィンドウを変更するなとあります。
Windows 上のアプリケーションは、このガイドラインに従うべきであり、
Z order は触らない方がいいということになります。


Tags: :Windows, :ウィンドウ・システム, :プログラミング


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS