2013/12/13(金)fi-6130のTWAINがフォーカスを取るのを抑止する
2013/12/13 16:27
とりあえずAPIフックで対処可能。
Windows API Hooking Tutorial
上を参考に、SetForegroundWindowを握りつぶせば良い。
最初単にグローバルフック(SetWindowsHookEx)でどうにかなるような気がしていたのだが、WM_ACTIVEAPPメッセージを握りつぶそうとしてもうまくいかなかった(WM_ACTIVEAPPが飛んできたタイミングは捕まえられる。そこで元のウィンドウにフォーカス移すのはちょと……)。
実のところWindowsのメッセージ機構の理解にあやしいところがあって、キーボード・マウス以外のメッセージにキャンセル機構がないのか、SetWindowsHookEx自体の制限か、それともWM_ACTIVEAPPメッセージは通知だけで、ウィンドウのアクティブ処理自体はエクスプローラ側の触れない領域にあるのかといったあたり判断できてない。C++でWin32ネイティブアプリ書いて、WndProc内であれこれやってみれば結論が出るんだろうけど、今回は時間がないので次回以降の課題。
.NET系でもマウス・キーボードのグローバルフックがかけられることは覚えておこう。
ソース整理できたらそのうち載せたいけども、元コードのライセンスがわからないな……