IME 前後フィードバック機能

IMEには前後フィードバックという機能があります。
入力済みの文字列の後に入力する際にアプリケーションに対して前後の文字列を要求し、その情報により適切な単語を選択する機能です。例を挙げると以下のそれぞれの行末で「あつい」を変換すると、適切な単語に変換してくれます。

本は
お湯は
夏は

これにはアプリケーションからIMEへのフィードバックが必要になりますが、正式な技術情報がない。
microsoftから出ているのは構造体と問い合わせのシーケンスだけで、構造体に何をどのように返せばいいのか闇の中です。
検索に引っかかった情報は古いらしくてWin7(Vista以降)/MS-IMEの組み合わせで動作しない。
結局sakura-editorのソースをカンニングして得られた情報で動いたわけですが、MSがきちんと情報出してくれれば無駄な時間を使わずに済むのに…
と思います。

手順を書いておきます(Win7/MS-IME 2010, Xp64/IME-2002で動作確認)

概略


IMEからはmsg:WM_IME_REQUEST/wpara:IMR_DOCUMENTFEEDが2回来ます。
1回目はlparam:0でメッセージがsendされてきます、これに対しアプリケーションはフィードバックを返すために必要なサイズを返します。サイズはsizeof(RECONVERTSTRING)+文字列の長さ(バイト単位、終端の0を含む長さ)です。2回目は1回目で返したサイズの領域をIMEが確保してそれをlparamで渡してきます。
lparamで渡されたポインタはRECONVERTSTRINGの後に文字列用バッファが続いた領域へのポインタです。Cでは可変長配列が許されませんが、疑似的なコードで書くと以下のようにになります。



struct {
RECONVERTSTRING reconv;
TCHAR compstr[n];
};


アプリケーションは必要な情報をreconvとcompstrに格納し、前回と同じサイズを返します(0以外なら良いのかもしれませんが確認していません)。


フィードバックする情報


変換文字位置を含む文字列と変換中の文字列(ImmGetCompositionString:GCS_COMPSTRで取得)を返します。
本は、お湯は、夏は
という文字列を編集中と仮定します。がカーソル位置です。
フィードバックする情報はカーソル位置に,1回目の呼び出し時にImmGetCompositionStringで取得した文字列を挿入し
本は、お湯はあつi、夏は
を返すことになります。(あつiまで入力中にIMR_DOCUMENTFEEDが飛んできたとき)
ImmGetCompositionString:GCS_COMPSTRで取得する変換中の文字列は1回目と2回目の間で変更されるといやなので、1回目に取得したものを保存することにしました。

RECONVERTSTRING構造体



  • dwStrOffset
    sizeof(RECONVERTSTRING)すなわちcompstrの先頭オフセット(バイト単位)

  • dwStrLen
    compstrの長さ(TCHAR単位)

  • dwCompStrOffset
    ImmGetCompositionStringで取得した文字列のオフセット(バイト単位)

  • dwCompStrLen
    ImmGetCompositionStringで取得した文字列の長さ(TCHAR単位)

  • dwTargetStrOffset
    使われていません。dwCompStrOffsetと同じ値をセットします。

  • dwTargetStrLen
    使われていません。dwTargetStrLenと同じ値をセットします。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック