フックで発生したイベントでフォームのthis.Activate()を使うと高確率で失敗してタスクバーのアイコンがオレンジ色に点滅します。この場合、Win32APIでもフォーカスを奪えずかなり困ったことに。ちなみにデバッグでは通常通り動くからクセモノ……!
色々と調べた結果、どうやらフックで発生したイベントは必ずではないですがフォームのUIスレッドとは別スレッドで動くようです。そのためフック中のスレッドからUIの操作であるthis.Activate()を実行すると失敗するとかなんとか。デバッグ時に動くのはVisualStudioが勝手に同期してくれるかららしい。
これを解決するのにはInvokeメソッドでスレッドを同期してthis.Activate()すると良いらしいです。ただし、自分の環境だとそれでも失敗することがあるので他の方法を探しました。
そして、試行錯誤した結果、this.Activate()の前にフォームの最小化と元に戻すコードを追加するとなぜか機能するとわかりました。スレッドが元に戻るのかな? よくわからないけど、なんか動くからヨシ!
他になにか解決法があれば是非教えてください!
this.WindowState = FormWindowState.Minimized;
this.WindowState = FormWindowState.Normal;
this.Activate();
独習C# 第5版
Comments