ITfThreadMgr
COM公式ドキュメント
ITfThreadMgr は、TSF マネージャーが実装する中心的なオブジェクトを定義します。ITfThreadMgr は、アプリケーションおよびテキストサービスがテキストサービスの有効化/無効化、ドキュメントマネージャーの作成、ドキュメントコンテキストのフォーカス管理を行うために使用します。
解説(Remarks)
アプリケーションは、次の例のように CLSID_TF_ThreadMgr を指定して CoCreateInstance を呼び出すことで、このインターフェイスへのポインターを取得します。
テキストサービスは、ITfTextInputProcessor::Activate メソッドでこのインターフェイスへのポインターを受け取ります。
例
HRESULT hr;
ITfThreadMgr* pThreadMgr;
hr = CoCreateInstance( CLSID_TF_ThreadMgr,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITfThreadMgr,
(void**)&pThreadMgr);
メソッド 11
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ITfThreadMgr::Activate メソッド
| ptid | DWORD* | out | クライアント識別子を受け取る TfClientId 値へのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ptid が無効です。 | |
| スレッドが無効化されている最中にこのメソッドが呼び出されました。 |
解説(Remarks)
このメソッドは 1 つのスレッドから複数回呼び出せますが、各呼び出しは同じスレッドからの対応する ITfThreadMgr::Deactivate の呼び出しと対にする必要があります。
ITfThreadMgr::Deactivate メソッド
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| スレッドが有効化されている最中にこのメソッドが呼び出されたか、この呼び出しに対応する ITfThreadMgr::Activate の呼び出しがありませんでした。 |
解説(Remarks)
このメソッドの各呼び出しは、先行する ITfThreadMgr::Activate の呼び出しと対にする必要があります。また、対応する ITfThreadMgr::Activate を呼び出したスレッドと同じスレッドから呼び出す必要があります。
ITfThreadMgr::CreateDocumentMgr メソッド
| ppdim | ITfDocumentMgr** | out | ドキュメントマネージャーオブジェクトを受け取る ITfDocumentMgr インターフェイスへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ppdim が無効です。 | |
| メモリの割り当てに失敗しました。 |
解説(Remarks)
呼び出し元は、不要になったドキュメントマネージャーを解放する必要があります。
ITfThreadMgr::EnumDocumentMgrs メソッド
| ppEnum | IEnumTfDocumentMgrs** | out | 列挙子を受け取る IEnumTfDocumentMgrs インターフェイスへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ppEnum が無効です。 | |
| メモリの割り当てに失敗しました。 | |
| 不特定のエラーが発生しました。 |
解説(Remarks)
呼び出し元は、不要になった列挙子を解放する必要があります。
ITfThreadMgr::GetFocus メソッド
| ppdimFocus | ITfDocumentMgr** | out | 現在入力フォーカスを持つドキュメントマネージャーを受け取る ITfDocumentMgr インターフェイスへのポインター。フォーカスを持つドキュメントマネージャーが存在しない場合は NULL を受け取ります。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| フォーカスを持つドキュメントマネージャーがありません。ppdimFocus には NULL が設定されます。 | |
| ppdimFocus が無効です。 |
ITfThreadMgr::SetFocus メソッド
| pdimFocus | ITfDocumentMgr* | in | 入力フォーカスを受け取る ITfDocumentMgr インターフェイスへのポインター。このパラメーターに NULL を指定することはできません。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pdimFocus が無効です。 |
解説(Remarks)
アプリケーションは、ドキュメントウィンドウが入力フォーカスを受け取ったときにこのメソッドを呼び出す必要があります。ITfThreadMgr::AssociateFocus を使用してウィンドウとドキュメントマネージャーを関連付けている場合は、TSF マネージャーがアプリケーションに代わってこのメソッドを呼び出します。
ITfThreadMgr::AssociateFocus メソッド
| hwnd | HWND | in | フォーカスを関連付けるウィンドウのハンドル。 |
| pdimNew | ITfDocumentMgr* | in | フォーカスを関連付けるドキュメントマネージャーへのポインター。TSF マネージャーはオブジェクトの参照カウントを増やしません。この値は NULL でもかまいません。 |
| ppdimPrev | ITfDocumentMgr** | out | そのウィンドウに以前関連付けられていたドキュメントマネージャーを受け取ります。以前の関連付けがない場合は NULL を受け取ります。このパラメーターに NULL を指定することはできません。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 1 つ以上のパラメーターが無効です。 |
解説(Remarks)
このメソッドは、アプリケーション開発者の利便性のために用意されています。ウィンドウのフォーカスをドキュメントマネージャーに関連付けると、そのウィンドウがフォーカスを受け取ったときに、TSF マネージャーが関連付けられたドキュメントマネージャーを指定して ITfThreadMgr::SetFocus を自動的に呼び出します。
このメソッドで関連付けられるのは、1 つのウィンドウと 1 つのドキュメントマネージャーだけです。1 つのウィンドウに複数のドキュメントマネージャーを関連付ける場合(またはその逆の場合)、実装側で ITfThreadMgr::SetFocus を呼び出して適切なドキュメントマネージャーにフォーカスを設定する必要があります。
以前のフォーカスの関連付けを復元するには、同じウィンドウハンドルと、最初の呼び出しで ppdimPrev に返された値を pdimNew に指定してこのメソッドを呼び出します。次に例を示します。
//associate the focus for m_hwnd with m_pDocMgr
pThreadMgr->AssociateFocus(m_hwnd, m_pDocMgr, &m_pPrevDocMgr);
//Restore the original focus association.
ITfDocumentMgr *pTempDocMgr = NULL;
pThreadMgr->AssociateFocus(m_hwnd, m_pPrevDocMgr, &pTempDocMgr);
if(pTempDocMgr)
{
pTempDocMgr->Release();
}
if(m_pPrevDocMgr)
{
m_pPrevDocMgr->Release();
}
ITfThreadMgr::IsThreadFocus メソッド
| pfThreadFocus | BOOL* | out | 呼び出し元スレッドが入力フォーカスを持つかどうかを示す値を受け取る BOOL へのポインター。呼び出し元スレッドがフォーカスを持つ場合は 0 以外の値、持たない場合は 0 を受け取ります。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pfThreadFocus が無効です。 |
ITfThreadMgr::GetFunctionProvider メソッド
| clsid | GUID* | in | 取得する関数プロバイダーの CLSID。呼び出し元スレッドに登録された関数プロバイダーの CLSID、または次の定義済みの値のいずれかを指定できます。
| ||||||
| ppFuncProv | ITfFunctionProvider** | out | 関数プロバイダーを受け取る ITfFunctionProvider インターフェイスへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| clsid に一致する関数プロバイダーが利用できませんでした。 | |
| GUID_SYSTEM_FUNCTIONPROVIDER が要求されましたが、取得できませんでした。 |
解説(Remarks)
関数プロバイダーは、IID_ITfFunctionProvider を指定して TSF マネージャーの ITfSourceSingle::AdviseSingleSink メソッドを呼び出すことで登録します。
ITfThreadMgr::EnumFunctionProviders メソッド
| ppEnum | IEnumTfFunctionProviders** | out | 関数プロバイダーの列挙子を受け取る IEnumTfFunctionProviders インターフェイスのアドレス。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ppEnum が無効です。 | |
| メモリの割り当てに失敗しました。 | |
| 不特定のエラーが発生しました。 |
解説(Remarks)
列挙子には、登録された関数プロバイダーのみが含まれます。ITfThreadMgr::GetFunctionProvider で説明されている定義済みの関数プロバイダーは含まれません。
関数プロバイダーは、IID_ITfFunctionProvider を指定して TSF マネージャーの ITfSourceSingle::AdviseSingleSink メソッドを呼び出すことで自身を登録します。
ITfThreadMgr::GetGlobalCompartment メソッド
| ppCompMgr | ITfCompartmentMgr** | out | グローバルコンパートメントマネージャーを受け取る ITfCompartmentMgr インターフェイスへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ppCompMgr が無効です。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ITfThreadMgr "{AA80E801-2021-11D2-93E0-0060B067B86E}" #usecom global ITfThreadMgr IID_ITfThreadMgr "{}" #comfunc global ITfThreadMgr_Activate 3 var #comfunc global ITfThreadMgr_Deactivate 4 #comfunc global ITfThreadMgr_CreateDocumentMgr 5 sptr #comfunc global ITfThreadMgr_EnumDocumentMgrs 6 sptr #comfunc global ITfThreadMgr_GetFocus 7 sptr #comfunc global ITfThreadMgr_SetFocus 8 sptr #comfunc global ITfThreadMgr_AssociateFocus 9 sptr,sptr,sptr #comfunc global ITfThreadMgr_IsThreadFocus 10 var #comfunc global ITfThreadMgr_GetFunctionProvider 11 var,sptr #comfunc global ITfThreadMgr_EnumFunctionProviders 12 sptr #comfunc global ITfThreadMgr_GetGlobalCompartment 13 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ITfThreadMgr "{AA80E801-2021-11D2-93E0-0060B067B86E}" #usecom global ITfThreadMgr IID_ITfThreadMgr "{}" #comfunc global ITfThreadMgr_Activate 3 sptr #comfunc global ITfThreadMgr_Deactivate 4 #comfunc global ITfThreadMgr_CreateDocumentMgr 5 sptr #comfunc global ITfThreadMgr_EnumDocumentMgrs 6 sptr #comfunc global ITfThreadMgr_GetFocus 7 sptr #comfunc global ITfThreadMgr_SetFocus 8 sptr #comfunc global ITfThreadMgr_AssociateFocus 9 sptr,sptr,sptr #comfunc global ITfThreadMgr_IsThreadFocus 10 sptr #comfunc global ITfThreadMgr_GetFunctionProvider 11 sptr,sptr #comfunc global ITfThreadMgr_EnumFunctionProviders 12 sptr #comfunc global ITfThreadMgr_GetGlobalCompartment 13 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。