目次

概要

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

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

SetForegroundWindow?

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

使用条件

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

MSDNによると、

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

AttachThreadInput?

【C#】アクティブでないアプリケーションのFormを
アクティブ表示に変更したい - Insider.NET - @IT
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32993&forum=7

基本的にアクティブにした際(切り替え時)は、タスクバーが点滅するだけですが、
このウインドウを、最前面に出すのは、以下のような処理が必要になります。

#2360-3
RE#2347:アプリケーションの切替方法について
■ゆー太郎2001-12-03(月) 23:43

SetForegroundWindow? を使うのが今までの手法だったのですが、
Win98 からOS の動作が変わりました。
タスクバー上で点滅するのみになります。

これは
 「プログラムが勝手に、前面のウインドウを操作するのはおかしい。」
という考えを元にしてます。

なので、ご希望の動作は、「出来ない/してはならない」ことになります。(-_-;)

それでも無理やり やりたいのであれば、
AttachThreadInput? Win32 APIで無理やり現在アクティブなスレッドに
自分のスレッドをアタッチして、その間にBringWindowToTop? API関数で
自分のフォームを前面に出します。

その後もう一度AttachThreadInput? 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 は触らない方がいいということになります。


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