XKeymacsを今度こそ改良した

前に公開したXKeymacsが、64bit版のWindowsでまともに動かないことにようやく気付いた。その前に公開したXKeymacs64のほうがずっとましだった。実は自分のPCは32bit版のWindows 7を入れていて64bit版のWindowsを常用していなかったので、気づくのが遅れてしまった。最近64bit版に入れ替えたので、ひどい出来であることに気付いた。
悪くなっていた原因はキーボードフックをグローバルにしたことにある。キーボードフックをグローバルにすると、32bitと64bitのキーボードフックが一つのアプリケーションに両方機能してしまう。この問題は、32bitのフックは32bitのアプリケーションにだけ、64bitのフックは64bitのアプリケーションにだけ機能させればよいので、前に公開したXKeymacsではそうしていた。

しかし、キーボードフックをグローバルにすると、あとに掛けたフックしかキーボードフォーカスを持てない。64bitのフックをあとに掛けると、32bitアプリケーションでも64bitのフックがキーボードフォーカスを持つ。32bitのフックはキーボードフォーカスを持たないためIMEの制御ができない。

この問題はid:kikairoyaさんが解決してくれたので、それで大丈夫だと思ってバイナリを公開した。しかし、フックがキーボードフォーカスを持たないと、IMEが制御できないだけではなくキーボードの状態も正しく取得できないので、XKeymacsの動作全体がおかしいことに気付いた。

そこでキーボードフックはスレッドローカルに戻すことにした。キーボードフックをかけるタイミングは、任意のメッセージがWindowに届いたときにした。これで正しく動くようになったと思う。

僕が改良したバージョンをXKeymacsとしてリリースする権利を、XKeymacsの作者の大石さんから譲り受けたので、新しいホームページを作って公開し始めた。直したバイナリはこのホームページからダウンロードできるので試してみてほしい。