IMEサポート機能
ATOKからGoogleに乗り換えるに当たって、やっぱり文字入力位置にフロートする何かしらが欲しい。
そういう機能を欲しがる人はたくさんいるはずで、実際にフリーソフトとして誰かが作っている。
その中の一つを試してみたのだが、32ビットアプリにしか効かないとか、
キャレット位置ではなくマウス位置にフロートするとか、文字入力できない部分にもフロートするとか、
どうにかできそうな点がいろいろあったので、どうにか出来るかどうかを自分でやってみたくなった。
そのくらいのことはグローバルフックを使えば簡単にできるだろうし、
64bitでもフックしているタブマンコにチョチョイと手を加えて、すぐできるだろうと思った。
だが問題山積でどうにもならん。
まず、グローバルフックで入力フォーカスを監視するという所までは問題ない。
しかし、フォーカスを得たコントロールが文字入力を受け付けるものかどうかを判別できない。
しょうがないので、フォーカスではなくキャレットを監視して、キャレット位置にフロートさせようと方法を模索。
本来の普通のWIN32APIではキャレットを監視できないが、DLLインジェクションという方法を使って、
キャレットのAPI呼び出しを横取りできたので、キャレットがある位置を特定することはできた。
しかし、すべてのアプリのすべてのキャレットを横取りすることは出来ていなくて、
クロームはアドレスバーでもフォームのテキストボックスでもキャレットを拾えてるのに、
IEではアドレスバーだけ拾えてフォームのテキストボックスは拾えないとか、
真魚だとGrepのテキストボックスは拾えてるのに、メイン窓は拾えない。
コモンコントロール限定というわけではないようだが、真魚はAPIでキャレットを書いてるのに拾えてないので、
キャレットAPIをすべて横取りするという目的は達成できてない。
これが達成出来れば、常にキャレットを追いかけてフロートするという動作はできるようになるはずだ。
あとはIMEのオン・オフ切り替えの瞬間を探知できればまともに動きそうだが、
切り替えの瞬間を感知できるグローバルフックというのはなく、横取りできるAPIもない。
キーボードを監視するにも、オン・オフ切り替えのキーをカスタマイズしてるかもしれないし、
言語バーをマウスで操作して切り替えるかもしれないからダメだ。
そうなると、リアルタイムじゃなくても1秒ごとにIMEの状態を調べて反映させるとかになるが、
IMEの状態を知ることができるはずのAPIがどうやっても動かない。
これが一番重要なのにこれができないと、キャレットを追いかけても意味が無い。
まぁ、これも達成出来れば欲しい機能はほぼ完璧に実現するだろう。
さらにそれ以上のどうしても乗り越えられない問題は、何故かブレークポイントを配置した時しか動かない。
一旦止めることが重要なのかもしれないので、止まるようなコードを入れてみてもやっぱりダメ。
うまくいかないことが多すぎて、これは完成前にやめちゃうかもね。