中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【windows10】SetForegroundWindowでアクティブにならない対策を考える

1.概要

SetForegroundWindowとは?

Win32 APIであり、指定されたウィンドウを最前面に表示させる関数
になります。


この関数はたまに使用しており、動作的にも問題なかったのですが
最近急にこの関数の動作が不安定になるといった現象が起き始めました。
※不安定とはごくまれに動作するといった感じです。


私の開発用PCでは動作するのに、他のPCでは動作しないなど
環境に依存している感じもあったので原因を調べてみることにしました。


動作環境は下記のとおり

【開発用PC】Windows10 Pro 1903

【動作が不安定なPC】Windows10 Enterprise 2016 LTSB 1607

2.現象

【C#.net】のアプリケーションから
【System.Diagnostics.Process.Start】を使って
別のアプリケーションを実行した際に
何故か最前面で起動しないといった現象から始まりました。


気にはなっていたのですが、時間もなかったので
そのままにしていたところ、
【SetForegroundWindow】についても期待の動作をしなかったため
これは何かあるだろうということで調査を行った次第であります。

3.原因と対策

原因についてははっきりわかっていないのですが
対策についてははっきりしています。

結論から言うとレジストリにある
【ForegroundLockTimeout】
が関係していることがわかりました。

これは何かというと

別セッション起動時に前面表示するか背面表示するかの選択時間

みたいです。


これだけでは意味がわかりませんが、どうやら
起動に時間のかかるアプリケーションがあった場合
起動を待っている間別の作業をしていると
起動が完了した時点でフォーカスが奪われてしまうのを防ぐ為
にあるのではないかと思いました。


ちなみにこれを【0】に設定することで
期待した動作を得られることが確認出来ました。
f:id:tsu--kun:20191225114722p:plain


ちなみに【200000ms】がデフォルト値となっていました。


SetForegroundWindowの記事については下記を参照
www.chuken-engineer.com