TT_IME 4.0(64bit対応)

http://merom686.g1.xrea.com/soft.html
ようやく64bitに対応。64bitのWindowsだと、エクスプローラからして64bitだからね。対応は必要だった。

メッセージでやり取りすることを思いついて、「これで行けるかな」となってからが絶望の連続。とにかく手が動かない。「本当にできるのだろうか」「完全には理解してないから、致命的な穴があるに違いない」など、不安ばかりが出てくる。

しかし、終わってみればそれほどの困難はなかった。自分の考えた仕様通りに書いていけば、だんだん理解が進んでいくし、それが自信にもなる。時間はかかったけど。

仕組み

x86版をメインとして、そこからx64版を起動する。アイコン以外は、それぞれがフルに機能を持つ。x64版がアイコンを変えたいときは、WM_COPYDATAでx86版に情報を送って変えてもらう。

通知領域をクリックしたときのメッセージはx86版にのみ来る。そのときに、64bitソフトのIME状態を表示していたら、x64版へメッセージを投げる。IME状態を表示している対象ソフトが32bitか64bitかは、最後にアイコンを切り替えたのがx86版かx64版かをx86版が記憶しておくことでわかる。

難しかったところ

x64版で、他所をクリックしてもメニューが消えない現象があり、SetForegroundWindowが効いていないのが原因だった。x86版からのSendMessage内で処理しているからだろうか。結局、そのSendMessageの直前でx86版にSetForegroundWindow(hWnd_x64)してもらうことで解決した。

メニューを出そうと通知領域をクリックしたとき、タスクバーのIME状態が表示されては困る。そこで、WM_LBUTTONDOWNからWM_LBUTTONUPまではアイコンを変えないようにしていたのだが、Windows 7ではアイコンがドラッグして動かせる影響か、この2つのメッセージがほぼ同時に来る。仕方ないので、Shell_TrayWndクラスを無視することで対応した。タスクバーをクリックしてもそれを検知できなくなってしまった。

32bitソフトは通知領域とビット数が違うので、よくわからない振る舞いをして混乱した。メニューが消えない問題にしても、64bitだからではないかと疑ってしまう。ほぼ全ての機能をx86版x64版の両方に乗せるという発想も、なかなか出なかった。