プログラミング研究所 プログラミング研究所 http://www.program-lab.jp/
プログラミング研究所
プログラム研究自作ソフトウェアプログラムメモリンク


  • カテゴリ別アーカイブ

    .NET Framework
    C++/CLI
    DirectX
    GBA
    JavaScript
    OSSの移植
    PHP
    Win32/64
    WordPress
    その他
    ソフトウェアの設定
    ツール
    ライブラリ
    自作ソフト
    製品レビュー


  • エントリ一覧


    Syndicate this site (XML)

    Powered by
    Movable Type







  • 管理者:NMVL

    nmvl★program-lab.jp
    ※アドレスの ★ を @ に置き換えてください。

    釣りの話題はこちらから
    www.fishing.hokkaido.jp






    « mp3infpをx64へ移植 | メイン | mp3infpをx64へ移植2 »

  • 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が少し邪魔かも。



    投稿者 NMVL : 2005年6月11日 16:10