IME自動切り替え機の作成

WindowsXP x64では、ATOKを使用できません。

正確には、32bitアプリケーション上では使用できますが、
Explorerなど64btアプリケーションでは使用不可となります。
それでも使おうと思うと、32bitアプリケーションではATOK、
64btアプリケーションではMS-IMEと、いちいちIMEを切り替えなければならず、
その手間を考えるとほとんど使うのは無理だと同じに思えます。
でも、やっぱりATOKのほうが使い勝手がいいし、2005にバージョンアップしてから
ほとんど使っていない状態は勿体ないので、できるだけATOKを使いたい。
そんな自分のわがままを叶えるため、32bit/64bitアプリケーションを判別し、
自動的にIMEを切り替えてくれるアプリケーションを作成したときの作業メモ・・・

  • 簡単な仕様
    1. 32bit/64bitアプリケーションを判別し、自動的にIMEを切り替えるアプリ
    2. ウィンドウ単位で、IMEの切り替えを行う
    3. ウィンドウがフォアグラウンドになったときが、切り替えるタイミング
    4. アプリは有効なウィンドウは持たずタスクトレイにアイコンを表示する。
      また、ここから右クリックメニューにより操作を行う
  • IMEの切り替え方法
    IMEの切り替え方法について、Googleなどで検索を行い調べてみると、
    ImmAPIを使用したIMEの制御方法については、資料が比較的多い。
    でも、IMEのアプリケーションそのものを切り替えることについては、
    無いに等しかった(見つけられていないだけ?)。
    途方にくれて、PlatformSDKのヘッダファイルを眺めていて唯一見つけた使えそうなAPIが、「IMPSetIME」
    まずは、これで切り替えができないかテストプログラムを組んでみる。
    しかし、どうやっても切り替えはできなくて、戻り値も失敗していることを示している。
    何せ、資料が少なく引数の構造体に考えられる限りのパラメータを与えてみたが、
    結局うまくはいかず、結局この方法はあきめた。
    次に目をつけたのが、IMEのホットキー。
    目をつけたというか、たまたま目に入って、その時に思いついたともいう。
    OSのIMEの切り替え機能に、それぞれホットキーを割り当て、
    それによりIMEを切り替えることができる機能がついている。
    アプリケーションからは、キー入力を送信してしまえば、後はOS側が勝手に切り替えてくれる。
    これなら、失敗することはないだろう。

  • フォアグラウンドウィンドウの検出と切り替えのタイミング作成
    フォアグラウンドウィンドウは、GetForegroundWindowにより簡単にわかるので
    これを定期的(500ms)に行い、直前のウィンドウハンドルと比較すればタイミングが作成できる

  • 32bit/64bitアプリケーションの判別方法
    32bit/64bitアプリケーションの判別には、IsWow64Processを使用する。
    IsWow64Processには、プロセスIDが必要になるため、
    GetForegroundWindowで得たウィンドウハンドルからスレッドIDを、
    さらにそのスレッドIDから、OpenProcessでプロセスIDを取得して、
    IsWow64Processを呼び出す。

  • キー入力の送信
    キー入力の送信には、SendInputを使用する。
    今回の場合、Alt+Shift+1でATOKに、Alt+Shift+2でMS-IMEに切り替わるように設定してあるので、
    送信データ構造体のINPUT構造体を6個確保して、それぞれのキー入力を
    Alt down, Shift down, 1 down, 1 up, Shift up, Alt up

    Alt down, Shift down, 2 down, 2 up, Shift up, Alt up
    に設定する。

  • ウィンドウハンドルの保存
    同じウィンドウに対して、何度も切り替え処理を行う必要は無いので、
    切り替え処理を行ったウィンドウハンドルは
    STL::setを使用して保存し簡単なデータベースとして蓄積した。
    また、定期的にIsWindowでウィンドウハンドルが有効であるかを調べ、
    有効でないものについてはデータベースから削除するようにする。

  • バルーンTipsによる変更の通知
    おまけ機能として、IMEの切り替えを行った場合にバルーンTipsで
    ユーザへ通知を行ってみることとした。
    バルーンTipsは、タスクトレイへのアイコンの登録を行うNOTIFYICONDATAで、
    uFlagsにNIF_INFOを指定すればよい。

以上の仕様によりアプリケーションを作成し、現在テスト運用中。
ATOKが使えるようになって、非常に快適。なことには間違いはありませんが、
勝手に切り替わるため、IMEとの挙動の違いに若干とまどうことが・・・
まぁ、そのうちになれるかな?
それより、バルーンTipsが少し邪魔かも。

“IME自動切り替え機の作成” への2件の返信

  1. 突然のメールをお許しください。
    MS-IMEで使うユーザー辞書の切り替え方法を検索して、
    このページにたどりつきました。
    エディターの様なものを作っておりますが、入力域によって
    複数のユーザー辞書をプログラム中から切り替えたいと思います。
    おそらく、ユーザー辞書ファイルの指定をどこで行うのか見つけ
    られません。参考資料などご存知でしたら、ご教示願えませんで
    しょうか。

  2. >参考資料などご存知でしたら、ご教示願えませんでしょうか。
    申し訳ありませんが、お役に立つことはできなさそうです。
    そもそもMS-IMEに辞書切り替え機能があるということを今まで知りませんでした。
    ATOKでしたら、F2~F5のキーで辞書を切り替えることが可能ですから上の記事のようにホットキーを使ってどうにかできそうですが・・・

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です