Home

宿題用のメモ

2014-07-13 22:40:10

現状の実装でいうと、ITfFnReconversion::GetReconversion メソッドの対象は、ITextStoreACP::GetSelection メソッドで取得される ITfRange インターフェイスなんだけど、それは、そもそも ITextStoreACP::SetText メソッドで設定されるやつ、と。

メモ帳での動作をデバッガで追ってみると、[ITfFnReconversion::Reconvert メソッドで再変換されるときに、繰り返し ITextStoreACP::SetText メソッドが呼ばれていると。ということは、再変換を実行する人が責任を持つ、ってことになりそう ( ただし、スタックにはメモ帳は出てこないんで、おそらく、IME の UI 部分なんだろうと思います )。

そんで、この場合、『文章全体を再変換して、頭から変換結果が返ってくる』ことを利用して、変換結果 ( には、変換前の文字列が含まれているみたい ) を文章からカットし、繰り返し再変換していく、ということでなんとなく実現できそうな感じです。ただ、試してたときに、文章全体が再変換対象になって、結果的に変換前のひらがなと変換後のカタカナの二種類しか取れないという哀しい状況になったりしました。

こうなるとどうしようもないので、普通に MeCab みたいな形態素解析器で単語に分割するのがいいのかも。


TSF における ImmGetConversionList 関数の代替としては、ITfFnSearchCandidateProvider というインターフェイスがあるみたいなんだけど、残念なことに Windows 8 から。ということは、( 再変換ではない ) 変換リストをとる方法ってのは、( Windows 8 より前の ) TSF では用意されていない、という感じがします。

このほかの方法としては、あらかじめ ISC_SHOWUICANDIDATEWINDOW をクリアしておいて ImmGetCandidateWindow 関数でどうだろう? とか、ImmDisableTextFrameService 関数で TSF を無効にしたらどうだろう? とか思い浮かびましたが、試してません。


Go to TopGo to Top