読者です 読者をやめる 読者になる 読者になる

Windows ゲーム環境と日本語入力 (3)

Vista DirectX

「明日」とか言っていた割に数日更新があいてしまってすみません.
38 度の熱で寝込んでいたというのもありますが,勘違いがあってはいけないともう一度入念に資料を調べたり Vista RTM 版で試行錯誤していたりしたところ時間がかかってしまったというのもあります.まあ収穫はあって,CustomUI サンプルを Vista で動かして,変換候補を取得することができました.TSF ではなく IMM32 API で.

何というか,この件一番正しかったのはやはりドキュメントでした.
MSDN Home > Windows Vista デベロッパー センター > 開発者向け互換性情報」で「アプリケーション互換性情報パック」というのが公開されているのですが,その中にある「IMM32互換性情報.doc」にある通り,TSF 環境の Vista でも条件付きで ImmGetCandidateList API はサポートされます.

ImmGetCandidateList

WM_IME_SETCONTEXTでlParamのISC_SHOWUICANDIDATEWINDOWフラグがリセットされている場合に限り、Candidate Listを取得することが可能です

ただし、TSFによってWM_IME_SETCONTEXTによらずに代替することが可能です

UILess ModeはVistaでサポートされた機能です。それ以前のWindowsではサポートされていません

UILess Mode OverviewのドキュメントがMSDNにアップされる予定です

CustomUI サンプルは,一見 lParam をクリアしている様に見えるのですが,実はそれはコピーされた変数で,DefWinProc に渡される lParam は全くクリアされていないというのが原因でした.
ちなみに TSF の UILess Mode Overview ですが,既に (英語版ですが) 公開されています.

また別ルートで CustomUI サンプルが修正されるという話も聞いているのですが,これは TSF ベースの修正ではなく IMM32 ベースの修正かもしれません.実際,上のスクリーンショットをとる上でどんな修正をしたかというと,

  • WM_IME_SETCONTEXT で lParam が正しくクリアされていなかったのをクリアするようにした.
  • UNISCRIVE_DLLNAME, IMM32_DLLNAME, VER_DLLNAME マクロに定義されているファイル名の先頭の \\ を削除.(追記) DirectX SDK Dec 2006, DirectX Feb 2007 付属の DXUTgui.cpp でこの修正は必要ではありますが,Vista で起きる問題とは別件のバグです.

というものです.まあこれぐらいの変更ならさくっとできるかなと.後者は DLL の検索順序絡みで暗黒面がまた 1 つ,という感じでしょうか.DirectX SDK Dec 2006 の DXUTgui.cpp で起きた degrade の模様.

時系列

言い訳っぽいですがこの件の時系列.

    1. Vista 上の Custom UI サンプルで変換文字列が取得できないという情報をゲット.
    2. 『ベータ 2 評価ガイド (日本向け重要項目)』(2006年6月公開) にて以下の文章を発見.
      • WM_IME_NOTIFY/IMN_CHANGECANDIDATE、IMN_CLOSECANDIDATE、IMN_OPENCANDIDATE をフックして候補リストを描画するアプリケーションは、Windows Vista の IMM 互換レイアは、ImmGetCandidateList() によって候補リスト文字列を返します。候補リストを描画するいくつかの DX ゲーム アプリケーションは、IMM 互換レイアを通してTSF ベースの IME と動作するようになります。
    3. Connect サイトにフィードバック投稿.(2006/08/28)
    4. MSKK よりフィードバック 187757 への回答.(2006/10/20)
    5. この時点で公開されていた『RC-1 評価ガイド』では,上記 ISC_SHOWUICANDIDATEWINDOW フラグの仕様について追記されていたものの,CustomUI がこのフラグをリセットし損ねていることを私が見落とす.
    6. Microsoft,DirectX SDK Dec 2006 でこっそり DXUT に変更を加える.が,DXUTgui.cpp への変更のせいで imm32.dll 等の LoadLibrary が失敗するようになる.(TSF とは別件のバグ)
    7. 今に至る

うーん,やっぱり「RC-1 評価ガイド」のタイミングで気付きたかったですなー.あのときもうちょっと念入りに調べていれば,ここまで引っ張らずにすんだのですが.
また,恐らく TSF の該当モジュール (CUAS; Cicero Unaware Application Support) の開発グループでは「現状の CustomUI の IMM32 の取り扱いに問題がある」ことを掴んでいたのだと思いますが,それがもっと早期に公知されていれば,あるいはもっと早期に DirectX SDK で修正されていれば,IME 周りの混乱ももっと少なくてすんだのに,というところでしょうか.
私が確認で手を抜いたばっかりに,混乱させてしまった皆様にお詫び申し上げます.