いつの間にかキーボードフックが外れる件はDeltaEndの問題ではなく、OSの仕様変更と私の環境固有の傾向による問題とわかりました。
Windows 7から、ローレベルフックに
タイムアウトが設定されたのだそうです。300msを10回超えると勝手にフックが外れるというもので、しかも、同じプロセスからは二度とかけ直せない。
そして私は新OSに慎重な場合はサブ環境、つまり遅いPCで使い始めるのを習わしとしているために、最近Vistaから8.1にしたThinkPad X61 Tabletや、DELL Dimension 9200Cで発生していたわけです。
DeltaEndのキーボードフックはかなり単純だと認識していますが、それでも時として300msを超えていることになります。スワップ発生中とかでしょうが、如何に横暴な仕様かわかろうものです。
回避法はレジストリによる設定(最大10秒)ですが...
DWORDで以下の値に設定、単位はms、デフォルトは300(のはず)。
HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout
上記記事だと300msがデフォルトに見えますが、確認したところレジストリ値は既に存在し5000(5秒)というデータがありました。一説によるとVisual Studio 2010以降のインストーラーが書き込むのだとか。マイクロソフト自身の製品ですら困る仕様ってことですか。
DELL 9200Cの方はしばらく再現していませんが、本格的に使い始めたのでVisual Studioも一通り入っており、タイムアウトが既に5秒になったお陰の可能性が高いです。
MacBook MB062J/Bで発生していなかったのも、7にする前のVista時代から既にVisual Studio 2010が入っていたためと考えられます。
問題は、フックが外された際にそれを検出する方法がないことと、実行ファイルを立ち上げ直さなければならないことです。
定期的かアイドル中に自動再起動をかけ続けるほど重要なソフトではないので、ユーザー操作での再起動で良いでしょう。マスタープロセスはUIだけの担当にして、キーボードフックはスレーブプロセスに担当させる感じでしょうか。
64ビット版Windowsではスレーブプロセスは32と64の2つになり、キーボードフックは両方にかかるので、その片方だけが担当。となると、筆頭スレーブのフラグを新設することになりますね。
何はともあれ、原因がはっきりして良かったです。
最近のコメント