[WinSDK] ウィンドウを前面に出す方法

ウィンドウをフォアグラウンド(前面)にする方法は、SDK関数SetForegroundWindowを使用する。ただしこの関数を使用したからといって常に前面にでるとは限らない。

SetForegroundWindow
http://msdn.microsoft.com/ja-jp/library/cc411039.aspx

上記のMSDNによると、

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

とゆー条件がある。よく前面に出す方法として次のコードが掲げられているが、これだけでは不十分なのだ。さて、どこが不十分なのか?

// _pid (自分のプロセスID)
// pid  (切り替え先のプロセスID)
// hWnd (切り替え先のウィンドウハンドル)
// sptime (タイムアウト保持変数)

// ウィンドウに対して前面に出すように処理をする
AttachThreadInput(_pid, pid, 1);                                  // 入力アクティブ切り替え
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &sptime, 0); // タイムアウトを保持
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0);      // タイムアウトの設定
SetForegroundWindow(hWnd);                                        // ウィンドウ切り替え
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, sptime, 0); // タイムアウトの復元
AttachThreadInput(_pid, pid, 0);                                  // 入力アクティブの復元

どうも私が実装する限りだと、上記のコードだけでは、自分で他のプロセスのウィンドウを前面に出すということができない。いや正確には、前面に出せないときはそのウィンドウが点滅するだけになる(たまに成功するのがまたややこしい…^^;)。

…この答えは、上記の条件にもある、「そのプロセスがフォアグラウンドプロセスである。」「フォアグラウンドがロックされていない」にヒントがある。要するに、入力途中で他のプロセスのウィンドウを出させないために、自分のプロセスが起動しているときは、初めから他のプロセスのウィンドウに行かせないようになっている(LockSetForegroundWindow関数を実行している状態)のだと考えられる。なので、次の関数を使うべきだ。

AllowSetForegroundWindow
http://msdn.microsoft.com/ja-jp/library/cc430255.aspx

この関数を切り替えOKのタイミングで使うことで、点滅になること無く、他のプロセスのウィンドウを前面にできる。もちろん切り替えさせたくないときは、この逆の関数

LockSetForegroundWindow
http://msdn.microsoft.com/ja-jp/library/cc410898.aspx

を使えばよい。

About these ads

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

フォロー

新しい投稿をメールで受信しましょう。

%d人のブロガーが「いいね」をつけました。