2011年8月22日月曜日

Windows7でグローバルフックが効かなくなる

グローバルフックを使ったアプリを使っていたら、起動直後はちゃんと動くんだけれどそのうち動かなくなるという現象が発生していて、調べてみたらWindows7から少し仕様が変わったらしい。

http://blogs.msdn.com/b/alejacma/archive/2010/10/14/global-hooks-getting-lost-on-windows-7.aspx

フック処理がタイムアウト(300ms)を10回超えちゃうと、グローバルフックが解除されてそのプロセスからは二度と有効化できないと…

はっきり言ってこれは仕様不良。フック処理で重い処理を走らせないように作っても、一定以上の負荷がかかることもあるPCでタイムアウトを起こさないなんてことは無理。スワップアウトしてIO待ちで終わり。実際、if文で整数の値を判定してreturnするだけの処理ですらタイムアウトした。

レジストリの値を変えてタイムアウトを大きくすることで多少低減できるらしいので、アプリ起動時に値を追加しちゃうという手はある。勝手にシステムのレジストリの値を変えるのは良くないという人もいそうだけど、グローバルフックを利用したアプリがまともに使えないバグ持ちのOSを治すパッチを当てているみたいなものなので勘弁して欲しいものだ。
HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeoutを大きくすれば良いんだけど… どのくらいにすれば回避できるんだろうか…

アプリをマルチプロセス構成にして、一定時間ごとに再起動をかけさせるのが正しい対処法なのかもしれないけど、こんな腐れた仕様にあわせてそんな面倒なことしたくない。

(後記:と言いつつマルチプロセス構成にしてしまった。他にもっとエレガントな解決法はないんだろうか。)

0 件のコメント:

コメントを投稿