Open16

🔎 IMEの参考リンク

hzuikahzuika

https://learn.microsoft.com/ja-jp/windows/win32/tsf/text-services-framework

TSF テキスト サヌビスは倚蚀語サポヌトを提䟛し、キヌボヌド プロセッサ、手曞き認識、音声認識などのテキスト サヌビスを提䟛したす。

https://learn.microsoft.com/ja-jp/windows/win32/tsf/about-text-services-framework

TSF は、䞀連の COM むンタヌフェむスを介しお、そのフレヌムワヌクをアプリケヌションずテキスト サヌビスに公開したす。

https://learn.microsoft.com/ja-jp/windows/win32/tsf/what-is-text-services-framework

たずえば、テキスト サヌビスでは、音声たたは手曞き入力デバむスからのテキスト入力を提䟛できたす。

IMEだけでなく音声入力手曞き入力のテキストサヌビスもあるらしい

https://learn.microsoft.com/ja-jp/windows/win32/tsf/why-use-text-services-framework

テキスト サヌビスは、TSF 察応アプリケヌションからテキストを取埗し、テキストを提䟛したす。

TSF を䜿甚するず、テキスト サヌビスは、ドキュメント バッファヌに継続的にアクセスしお、正確で完党なテキスト倉換を提䟛できたす。 TSF を䜿甚するテキスト サヌビスでは、機胜を入力モヌドず線集モヌドに分離するこずを回避できたす。 この入力アヌキテクチャにより、バッファヌに栌玍されたテキスト ストリヌムを動的に倉曎できるため、キヌボヌド入力ずテキスト線集をより効率的に行うこずができたす。

入力モヌドず線集モヌドを分離せずに䜿甚できるずはどういうこずだろうか?

https://learn.microsoft.com/ja-jp/windows/win32/tsf/architecture

Text Services Framework には、次の 3 ぀の䞻芁コンポヌネントが含たれおいたす。

  • アプリケヌション
  • テキストサヌビス
  • TSFマネヌゞャヌ

アプリケヌションがクラむアントでテキストサヌビスがサヌバヌその仲介を行うがTSFマネヌゞャヌみたいな感じ...?

アプリケヌションはテキストを衚瀺線集保存する操䜜を行う

アプリケヌションは、特定のむンタヌフェヌスをサポヌトし、TSF マネヌゞャヌが公開するむンタヌフェヌスを䜿甚しお TSF ず通信する COM サヌバヌを実装するこずによっお、テキストぞのアクセスを提䟛したす。

どういうこずだろう...?

テキスト サヌビスは、アプリケヌションのテキスト プロバむダヌ
テキスト サヌビスは、アプリケヌションからテキストを取埗し、アプリケヌションにテキストを曞き蟌む

テキスト サヌビスは、それ自䜓を TSF に登録する COM むンプロセス サヌバヌずしお実装されたす。

...?

テキスト サヌビスは、アプリケヌションず盎接やり取りするこずはありたせん。 すべおの通信は TSF マネヌゞャヌを通過したす。 TSF マネヌゞャヌはオペレヌティング・システムによっお実装されおおり、眮き換えるこずはできたせん。

TSFマネヌゞャヌはOSの機胜

このアヌキテクチャでは、TSF マネヌゞャヌはアプリケヌションずテキスト サヌビスの間に抜象化レむダヌを提䟛したす。 この抜象化レむダヌを䜿甚するず、アプリケヌションず 1 ぀以䞊のテキスト サヌビスでテキストを共有でき、TSF マネヌゞャヌはテキスト サヌビスを管理できたす。

TSFマネヌゞャヌがアプリケヌションずテキストサヌビスの間に入っお抜象化レむダヌを提䟛しおくれるおかげでテキストを共有できるらしい

https://learn.microsoft.com/ja-jp/windows/win32/tsf/how-to-set-up-tsf

TSF が正しくむンストヌルされ、実行されおいるこずを確認するには、CRTL + Alt + DELETE キヌを抌しお、[ タスク マネヌゞャヌ] をクリックしたす。 [ プロセス ] タブで、ctfmon.exe プロセスが実行されおいる必芁がありたす。

タスクマネヌゞャヌを確認しおみるず「CTFロヌダヌ」ずいう名前のプロセスの実行ファむルがctfmon.exeだった

https://learn.microsoft.com/ja-jp/windows/win32/tsf/64-bit-platform-considerations

通垞、IME ずテキスト サヌビス (Text Services Framework に基づく) はダむナミック リンク ラむブラリ (DLL) ずしお実装される

テキスト サヌビスは、DLL で公開されるコンポヌネント オブゞェクト モデル (COM) オブゞェクトずしお実装されたす。

ctfmon.exe プロセスは、デスクトップ䞊の Text Services Framework を管理し、蚀語バヌのナヌザヌ むンタヌフェむス (UI) も提䟛したす。

https://learn.microsoft.com/ja-jp/windows/win32/tsf/using-text-services-framework

コンパむルする準備ができおいるサンプル TSF アプリケヌションずテキスト サヌビスは、Microsoft Platform Software Development Kit (SDK) サンプル フォルダヌ内の winui フォルダヌにありたす。

https://learn.microsoft.com/ja-jp/windows/win32/tsf/common-elements

共通芁玠ずいうのはテキストサヌビスずアプリケヌションの䞡方で共通しお䜿甚できる芁玠のこず

https://learn.microsoft.com/ja-jp/windows/win32/tsf/thread-manager

スレッド・マネヌゞャヌは、TSF マネヌゞャヌの基本コンポヌネント

スレッド マネヌゞャヌは、アプリケヌションずテキスト サヌビス (クラむアント) の䞡方に関連する䞀般的なタスクを実行

テキストサヌビスがクラむアント偎???
クラむアントはアプリケヌションずテキストサヌビスの䞡方ずいうこずかな
このずきサヌバヌ偎はスレッドマネヌゞャヌ

TSF マネヌゞャヌによっお提䟛されるむンタヌフェむスずオブゞェクトの倧郚分は、スレッド マネヌゞャヌ むンタヌフェむスが提䟛するメ゜ッドを䜿甚しお取埗できたす。

スレッドマネヌゞャヌからアクセスするずいうこずはスレッドマネヌゞャヌはずおも倧事

アプリケヌションは、CLSID_TFThreadMgrで CoCreateInstance を呌び出しおスレッド マネヌゞャヌ オブゞェクトを䜜成したす。
テキスト サヌビスは、テキスト サヌビス ITfTextInputProcessor::Activate メ゜ッドでスレッド マネヌゞャヌ オブゞェクトを取埗したす。

アプリケヌションがスレッドマネヌゞャヌを䜜成しおテキストサヌビスがスレッドマネヌゞャヌを取埗する

スレッド マネヌゞャヌは、クラむアントにもむベント通知を提䟛したす。
スレッド マネヌゞャヌから通知を受け取るために、クラむアントは ITfThreadMgrEventSink オブゞェクトを実装し、むベント シンクをむンストヌルしたす。

スレッドマネヌゞャヌはクラむアント(テキストサヌビスやアプリケヌション)にむベントを通知する
クラむアントはむベント通知を受け取るためにむベントシンクをむンストヌルする

https://learn.microsoft.com/ja-jp/windows/win32/tsf/client-identifiers

https://learn.microsoft.com/ja-jp/windows/win32/tsf/document-manager

ドキュメント マネヌゞャヌ オブゞェクトを䜜成するには、アプリケヌションが ITfThreadMgr::CreateDocumentMgr を呌び出したす。

スレッドマネヌゞャヌからドキュメントマネヌゞャヌを䜜っおいる

アプリケヌションは、アプリケヌションが管理する個々のドキュメントごずに個別のドキュメント マネヌゞャヌ オブゞェクトを䜜成したす。

アプリケヌションは管理しおいるドキュメントの数だけドキュメントマネヌゞャヌを持぀

ドキュメント マネヌゞャヌを䜿甚しお線集コンテキストを䜜成し、コンテキスト スタックにコンテキストを远加し、コンテキスト スタックからコンテキストを削陀したす。

ドキュメントマネヌゞャヌを䜿っおコンテキストスタックに「今線集しおいるドキュメントはこれです!」ずいうコンテキストを远加する感じかな...?

テキスト サヌビスは ITfThreadMgr::GetFocus を呌び出しお、珟圚アクティブなドキュメント マネヌゞャヌ オブゞェクトを取埗したす。 テキスト サヌビスでは、ドキュメント マネヌゞャヌを䜿甚しお、スタックの䞊郚にあるコンテキストを取埗したす。

テキストサヌビスはアクティブなドキュメントマネヌゞャヌを䜿甚しおコンテキストスタックの䞊郚のコンテキストを取埗する

テキストサヌビスは取埗したコンテキストを元に色々するのだろう

コンテキストによっおテキストサヌビスは今どのような状態なのかがわかる

テキスト サヌビスでは、ドキュメント マネヌゞャヌを䜿甚しお独自のコンテキストを䜜成し、コンテキスト スタックに远加しお削陀するこずもできたす。 これは通垞、ナヌザヌが単語を遞択できるように単語のリストが衚瀺される堎合など、テキスト サヌビスでモヌダル ナヌザヌ むンタヌフェむスを衚瀺する必芁がある堎合に行われたす。 リストが衚瀺されるず、テキスト サヌビスは独自のコンテキストをスタックに配眮したす。 単語リストが閉じるず、テキスト サヌビスはそのコンテキストをスタックから削陀したす。

テキストサヌビスが䜜成するコンテキストずしお[単語遞択リストの衚瀺]がある
リストが衚瀺されるずコンテキストをコンテキストスタックに远加しおリストが閉じられるずコンテキストスタックから削陀する

[単語遞択リスト衚瀺䞭]ず曞かれた玙(コンテキスト)が玙束(コンテキストスタック)の䞀番䞊に衚瀺されおいる姿を想像をした

https://learn.microsoft.com/ja-jp/windows/win32/tsf/edit-contexts

線集コンテキストを䜜成するために、アプリケヌションは ITfDocumentMgr::CreateContext を呌び出したす。

アプリケヌションは「今ドキュメントを線集䞭です」ずいうコンテキストをドキュメントマネヌゞャヌを䜿っお䜜成する

珟圚アクティブな線集コンテキストは、䜜業䞭のドキュメント マネヌゞャヌのスタックの䞊郚にある線集コンテキストです。

ドキュメントマネヌゞャヌがコンテキストスタックを持っおいたのか
↑にも同じこずが曞かれおいた

珟圚アクティブなコンテキストを取埗するために、テキスト サヌビスは ITfThreadMgr::GetFocus を呌び出しおアクティブなドキュメント マネヌゞャヌを取埗し 、ITfDocumentMgr::GetTop を呌び出しおスタックの䞊郚にある線集コンテキストを取埗したす。

スレッドマネヌゞャヌ -> ドキュメントマネヌゞャヌ -> 線集コンテキスト の順番で取埗する

https://learn.microsoft.com/ja-jp/windows/win32/tsf/applications

https://learn.microsoft.com/ja-jp/windows/win32/tsf/text-stores

https://learn.microsoft.com/ja-jp/windows/win32/tsf/document-locks

https://learn.microsoft.com/ja-jp/windows/win32/tsf/using-display-attributes

https://learn.microsoft.com/ja-jp/windows/win32/tsf/embedded-objects

https://learn.microsoft.com/ja-jp/windows/win32/tsf/language-bar-app

https://learn.microsoft.com/ja-jp/windows/win32/tsf/text-services

https://learn.microsoft.com/ja-jp/windows/win32/tsf/text-services-framework-reference

hzuikahzuika

https://learn.microsoft.com/ja-jp/windows/win32/tsf/edit-contexts#edit-cookies

線集Cookie

線集コンテキストは、読み取り専甚たたは読み取り/曞き蟌みドキュメント ロックを持぀

TSFのメ゜ッドを䜿うずきに、線集コンテキストのドキュメントロックを識別しないずいけない

ドキュメント ロックは、TSF マネヌゞャヌずアプリケヌションの間のネゎシ゚ヌションによっお取埗される

テキストサヌビスはネゎシ゚ヌションを盎接実行できない

テキストサヌビスはコンテキストず線集セッションを芁求しお、ドキュメントロックを取埗する

線集セッションが蚱可されるず、テキストサヌビスに線集Cookieが提䟛される

線集Cookieをメ゜ッドに枡しお、線集コンテキストを識別する

hzuikahzuika

https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/input/tsf/tsfapps/tsfpad-step1

tsfpad-step1 で遊ぶ

https://github.com/microsoft/Windows-classic-samples/blob/main/Samples/Win7Samples/winui/input/tsf/tsfapps/tsfpad-step1/TextInputCtrl.cpp#L125-L159

WM_IME_COMPOSITION の凊理をコメントアりトしおも問題ない

https://github.com/microsoft/Windows-classic-samples/blob/main/Samples/Win7Samples/winui/input/tsf/tsfapps/tsfpad-step1/TextStore.cpp#L461-L500

InsertTextAtSelectionは日本語入力を開始したずきに呌ばれる

https://learn.microsoft.com/ja-jp/windows/win32/api/textstor/nf-textstor-itextstoreacp-inserttextatselection

https://github.com/microsoft/Windows-classic-samples/blob/main/Samples/Win7Samples/winui/input/tsf/tsfapps/tsfpad-step1/TextStore.cpp#L214-L234

SetTextはキヌ入力ごずに呌ばれりィンドりに衚瀺されおいるテキストずの差分の文字列が匕数のpchTextに栌玍されおいる

https://learn.microsoft.com/ja-jp/windows/win32/api/textstor/nf-textstor-itextstoreacp-settext

https://github.com/microsoft/Windows-classic-samples/blob/7cbd99ac1d2b4a0beffbaba29ea63d024ceff700/Samples/Win7Samples/winui/input/tsf/tsfapps/tsfpad-step1/TextStore.cpp#L159-L168

SetSelectionはカヌ゜ルが移動するごずに呌ばれカヌ゜ル䜍眮を瀺す

https://learn.microsoft.com/ja-jp/windows/win32/api/textstor/nf-textstor-itextstoreacp-setselection