はじめに
Windowsの日本語入力のAPIとしてはIMM32がありましたが、IMM32の後継のText Services Framework (TSF)はインターフェースが100以上もあり非常に複雑でした。
通常の日本語入力ならTextBoxやRichTextBoxなどの入力コントロールを使えばよいのですが、自分でテキストエディタを作ったり、3Dゲームの画面で日本語入力をする場合はテキスト入力APIを使う必要があります。
ユニバーサル Windows プラットフォーム(UWP)ではWindows.UI.Text.Coreという新たなテキスト入力APIが追加され簡単に日本語入力ができるようになったので、サンプルアプリを作って動作を調べてみました。
Windows.UI.Text.Coreについては以下のマイクロソフトの記事が参考になります。
https://msdn.microsoft.com/en-us/windows/uwp/input-and-devices/custom-text-input
初期処理
ユーザーが最初にテキスト入力コントロールをクリックしてフォーカスを得たらGetForCurrentViewを呼んでCoreTextServicesManagerを得ます。
それからCoreTextServicesManagerのCreateEditContextを呼んでCoreTextEditContextを作成します。
イベントハンドラの登録など以降の処理はほとんどCoreTextEditContextに対して行います。
テキスト入力の流れ
IMM32では変換中のテキストの描画はIMM32側がやってくれたのですが、Windows.UI.Text.Coreではアプリ側が描画する必要があります。
挿入するテキストはTextUpdatingで通知され、下線などのテキストの書式はFormatUpdatingで通知されます。
アプリはこれらの情報を元にテキスト、下線、入力カーソルを描画します。
UI.Text.Coreではアプリ側とシステム側がテキストの内容や挿入位置などの情報を共有して、それらが変化した場合は相手側に通知するような仕組みになっています。
変換候補ウインドウ
変換候補ウインドウの描画はシステム側がしますが、変換候補ウインドウの表示位置をシステムに知らせる必要があります。
LayoutRequestedが呼ばれたらテキストの入力位置を返します。
テキスト挿入位置の変更
ユーザーが矢印キー(←,→)などでテキストの挿入位置を変更した場合はNotifySelectionChangedでシステムに変更を通知します。
これをしないと次回TextUpdatingが呼ばれたときに変な位置からテキストを挿入してしまうことになります。
同様にDeleteキーなどでテキストを変更した場合はNotifyTextChangedでシステムに変更を通知します。
感想
IMM32に比べると手間がかかりますが、TSFに比べるとアプリの実装がはるかに簡単になっています。
UI.Text.Coreの情報はまだほとんどなく試行錯誤をしている状態ですが、これからいろいろとアプリを作ってみたいと思います。
サンプル
UI.Text.Coreの簡単なサンプルを作ってGitHubに上げてあります。
https://github.com/teatime77/UI.Text.Core-Sample
Windows 10のバージョン**1511(10.0.10586.0)**以降でないと動作しないのでご注意ください。
サンプルの中のTestプロジェクトはUI.Text.Coreの動作を確認するための必要最小限のコードになっています。
単一行の文字入力で左右の矢印キー(← , →)とDeleteキーだけが使えます。
日本語・中国語・韓国語のMS IMEとGoogle日本語入力で動作を確認しています。
Testプロジェクトのメインのコードは以下になります。
MainPage.xaml.cs
TextEditorプロジェクトは実用的なエディタの雛形になることを目指して作った簡易版のテキストエディタです。
TextEditorの説明は以下をご覧ください。
テキストエディタを自作する方法