Windows Vista IMM32 関係まとめ

次の話に行く前にまとめ.

  • Windows XP / Windows Server 2003 までで使用されていた TSF 1.0 では,候補ウィンドウの独自描画や,変換候補一覧の取得といった,フルスクリーンゲーム開発で重要な IMM32 のフロントエンドの差し替え機能が削られていた.
  • Vista では TSF に改良が加えられ,新 TSF に対応した TIP (Text Input Processor, 従来の IME に相当) と組み合わせることで UILess mode が使用できるようになった.UILess mode に対応した TIP としては,Vista 付属の MSIME や,Office 2007 付属の MSIME 2007 などがある.これにより機能面でもやっと TSF で IMM32 を代替できるようになった.この他 Vista TSF には,Secure Desktop のサポートなど多数の改良がある.
  • Windows XP SP1 以降に搭載された「詳細なテキスト サービスのサポートをプログラムのすべてに拡張する」,またの名を CUAS (Cicero Unaware Application Support) は,IMM32 API を使用する従来のアプリケーションと TSF TIP を接続するエミュレーション層である.今回 Vista で急に IMM32 API エミュレーションが加わったのではなく,数年前から存在した技術が Vista でデフォルトオンかつ disable 不可に変わったというのが真相.
  • Windows XP 世代の CUAS は,候補ウィンドウの独自描画や,変換候補一覧の取得といった IMM32 の機能をエミュレートできなかった.これは,そもそも当時の TSF がそういった機能を持たないためである.その結果,IMM32 的には候補ウィンドウを消す正しい手順を踏んでいても,CUAS 使用時にはやはり候補ウィンドウが表示されてしまうという問題が起きる.これを回避するには,ImmDisableTextFrameService API を呼び出して該当アプリケーションに CUAS が使用されないようにする.CustomUI サンプルでも,冒頭で ImmDisableTextFrameService API を呼び出している.
  • Windows Vista での CUAS は改良が加えられ,IMM32 API の候補ウィンドウ独自描画や候補リストの取得が正式にサポートされた.ただし UILess Mode に対応した TIP を使用している場合に限る.
  • DirectX SDK Feb 2007 に付属する CustomUI サンプルは,WM_IME_SETCONTEXT への応答で,正しく lParam をクリアしないというバグを持っていた.従来はこれでも一見正しく動作しているように見えたが,CUAS によるエミュレーションが行われることによって,IMM32 の作法に従っていなかったことが発覚した.
  • なお Windows Vista では,ImmDisableTextFrameService API 呼出しは無視され,依然として CUAS は有効になる.CUAS の IMM32 エミュレーションは向上しており,正しく API を使用していれば問題が起きる可能性は少なくなっていると考えられる.
  • Windows Vista には従来通りの IMM32 の仕組みも残っている.これは ATOK 2006 など IMM32 にのみ対応した IME *1 使用時にのみ有効になる.従って,Vista 対応のアプリケーション実装する場合は,以下のいずれかを選択することになる.
    • IMM32 API のみを使用してアプリケーションを開発する.TSF TIP については CUAS にまかせる. (CustomUI など)
    • TSF と IMM32 API 両対応のアプリケーションを開発する.(Microsoft Word, Internet Explorer, Windows Presentation Foundation など)
  • DirectX SDK Feb 2007 に付属する CustomUI サンプルは,CUAS の件とは別に imm32.dll などのロードに失敗するバグがある.

*1:例えば Windows XP では MSIME 2007 を IME モードで使用できることから,MSIME 2007 は IMM32 にも対応しているはずなのだが,CUAS 有効時は TSF TIP としてのインターフェイスが優先されてしまうようである