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

さて,いまさらですが用語の定義でも.まず,IME を使用するアプリケーションは単に「アプリケーション」と呼ぶことにします.次に,MS-IME 2003 や ATOK 2006 などが,我々が普段呼ぶところの IME (Input Method Editor) です.そして,その仲介役を行うのが,IMM (Input Method Managers) ということになります.
10年以上使われてきたこの,アプリケーション - IMM - IME の仕組み (以下 Legacy IM と呼称する) は Windows 9x / Windows NT 4.0 で導入され,日本語だけでなく中国語や韓国語などの入力にも使用されています.伝え聞くところでは,このアーキテクチャは日本の MSKK が中心となって開発されたとのことです.
基本的にアプリケーションは IMM32 API を使用し,これの定義は Platform SDK (現在の Windows SDK) に含まれています.一方で,IME の実装には Windows DDK (現在の Windows Driver Kit) が必要ですが,基本的には IME API を実装するユーザモードの DLL を作成する作業になります.
Windows の IME の仕組みと他 OS の漢字変換の仕組みの比較という意味では,『日本語入力プログラミング』(オリジナル消失につき archive.org へのリンク) という資料が非常におもしろいのですが,オリジナルが Web から消えてしまっているので興味がある方は回収できるうちに回収しておくと良いでしょう.また UNIX 界隈の最近の動向については,ちょうど『Software Design 2007年3月号』で特集されています.IME 2007 の存在もあって漢字変換アルゴリズムの現状はネタ的に旬と言えるのですが,それについてはまた今度.
Legacy IM では,アプリケーションが IME の存在を意識しているかどうかで 3 つのパターンが存在します*1

IME-unaware applications
IMM/IME API を一切使用せず,IMM メッセージも全て DefWinProc に転送するアプリケーション.この場合の IME は,ユーザーのキー入力を必要に応じてフックし,デフォルトの UI ウィンドウを表示し,マルチバイト文字列または Unicode 文字列に変換後,それをウィンドウメッセージとしてアプリケーションに転送する役目を持つ.
Partially IME-aware applications
IMM/IME API を使用したり,IMM メッセージを解釈したりするアプリケーション.ただし,UI に関しては IME のデフォルトのものを使用するもの.
Fully IME-aware applications
IME が必要とする UI の管理と描画もアプリケーション側でおこなうもの.

この分類で行けば,日本語入力を必要とするような MMORPG などは Fully IME-aware applications ということになります.
Fully IME-aware applications になるためには,適切なタイミングで IMM32 API を呼び出し,適切な IMM メッセージを DefWinProc に渡さず独自に処理します.実際にどのようなシーケンスで処理を行うかは『IME as a Possible Keylogger』という資料の 6 ページ目,「Figure 6」の解説に詳しいです.これはIME が潜在的なキーロガーになりうるという,Symantic の White Paper ですが,その説明の過程でキー入力がどのように IME とアプリケーションの間を行き来しているかが詳しく解説されています.
表にあるように,キーが入力された後に適切に IMM32 API を呼び出したりメッセージをトラップしたりすれば Fully IME-aware applications になりますし,全く何もしなければ最終的に変換された文字が Win32 メッセージで降ってきます (IME-unaware applications).
さて,ここで IMM (IME) がキーボード入力を検査するタイミングは非常に特殊です.表を少し補えば,キー入力直後のデータの流れは以下のようになります.

  1. キーボードドライバが入力を得る
  2. 低水準フックを処理する
  3. システムはフォアグラウンドスレッドに結びついた IME の ImeProcessKey,ImeToAsciiEx を順に呼び出し,キーイベントを IME が握りつぶすかどうかを決めてもらう.

WM_KEYDOWN や WM_KEYUP が生成されるのは,この IME のキー検査後です.これはつまり,あるスレッドに WM_KEYDOWN や WM_KEYUP を送信しても,IME に擬似的なキー入力を行うことはできないということです.そもそも IME はシステムから直接キー入力をコールバックされるので,WM_KEYDOWN や WM_KEYUP を見ているわけではないのです.



明日はいよいよ TSF の紹介と Vista での変更点について.

*1:[http://www.microsoft.com/globaldev/DrIntl/faqs/ime.mspx#E6:title=Frequently Asked Questions - Input Method Managers and Editors (IMMs/IMEs) - What are the differences between IME-unaware, partially aware and fully aware apps?]