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

目次

概要

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

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

詳細

SetForegroundWindow?

ウィンドウの制御をプログラムから行う場合は、
SetForegroundWindow?のWin32 APIを使用できますが、
SetForegroundWindow?を使用する場合、以下の様な条件があるようです。

  • SetForegroundWindow? 関数
    https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setforegroundwindow

    MSDNによると、

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

AttachThreadInput?

SetForegroundWindow?でアクティブにならない場合には、

  • AttachThreadInput? API関数を呼び出した後に
  • BringWindowToTop? API関数を呼び出す。

参考

  • 【C#】アクティブでないアプリケーションのFormを
    アクティブ表示に変更したい - Insider.NET - @IT
    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32993&forum=7
    基本的にアクティブにした際(切り替え時)は、タスクバーが点滅するだけですが、~
    このウインドウを、最前面に出すのは、以下のような処理が必要になります。
  • VB初心者友の会 - Q&A掲示板過去ログ
    2302-2アプリケーションの切替方法について井藤君@ビギナー
    http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_2302_2.html

    #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?

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

Webからだと(ActiveX)

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

その他

常に最前面

起動時だけ最前面

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

Windowsの標準仕様

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

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

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


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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-03-23 (土) 21:44:23 (1853d)