ITfContext
COM公式ドキュメント
ITfContext インターフェイスは TSF マネージャーによって実装され、アプリケーションやテキストサービスが編集コンテキストにアクセスするために使用します。
解説(Remarks)
編集コンテキストオブジェクトは ITfDocumentMgr::CreateContext を呼び出して作成します。テキストサービスは通常、現在アクティブな編集コンテキストを使用します。現在アクティブな編集コンテキストとは、アクティブなドキュメントマネージャーのスタック最上位にある編集コンテキストです。
例
HRESULT hr;
ITfDocumentMgr *pFocusDoc;
hr = pThreadMgr->GetFocus(&pFocusDoc);
if(SUCCEEDED(hr))
{
ITfContext *pContext;
hr = pFocusDoc->GetTop(&pContext);
if(SUCCEEDED(hr))
{
//Use the context.
pContext->Release();
}
pFocusDoc->Release();
}
メソッド 15
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ITfContext::RequestEditSession メソッド
| tid | DWORD | in | 編集セッションを確立するクライアントを識別する TfClientId 値を格納します。 | ||||||||||||
| pes | ITfEditSession* | in | 編集セッションを実行するために呼び出される ITfEditSession インターフェイスへのポインター。 | ||||||||||||
| dwFlags | TF_CONTEXT_EDIT_CONTEXT_FLAGS | in | 次の値のうち 1 つ以上を格納します。
| ||||||||||||
| phrSession | HRESULT* | out | 編集セッション要求の結果を受け取る HRESULT 値のアドレス。受け取る値は要求した編集セッションの種類によって異なります。
|
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。phrSession にメソッドの詳細な結果データが格納されます。 | |
| 呼び出し元が、既にロックを保持している別のテキストサービスのコンテキスト内にあります。 | |
| コンテキストがドキュメントスタック上にありません。 | |
| 1 つ以上のパラメーターが無効です。 | |
| メモリの割り当てに失敗しました。 |
解説(Remarks)
保留中の非同期編集セッションは、受け取った順に処理されます。同期の編集セッションは、保留中の非同期編集セッションよりも先に処理されます。
テキストサービスは、既存の編集セッションのコンテキスト内で編集セッションを要求できます。ただし、読み取り専用セッション内で書き込みアクセスのセッションを要求することはできません。別のテキストサービスが確立した編集セッションのコンテキスト内でこのメソッドを呼び出すと、TF_E_LOCKED で失敗します。
同期の読み書き要求は、次の通知の処理中に行われた場合は失敗します。
ITfContext::InWriteSession メソッド
| tid | DWORD | in | クライアントを識別する TfClientID 値を格納します。 |
| pfWriteSession | BOOL* | out | クライアントがコンテキストに対する読み書きロックを保持している場合に 0 以外の値を受け取る BOOL へのポインター。クライアントが編集セッションを持たない場合、または読み取り専用の編集セッションの場合は 0 を受け取ります。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pfWriteSession が無効です。 |
解説(Remarks)
クライアントは通知コールバックの内部でこのメソッドを使用し、自身が変更を行う必要があるかどうかを判断します。
ITfContext::GetSelection メソッド
| ec | DWORD | in | 編集セッションを識別する編集クッキーを格納します。これは ITfEditSession::DoEditSession に渡された値です。 |
| ulIndex | DWORD | in | 取得する最初の選択範囲の 0 から始まるインデックスを指定します。既定の選択範囲を取得するには TF_DEFAULT_SELECTION を使用します。TF_DEFAULT_SELECTION を使用した場合は、選択範囲を 1 つだけ取得します。 |
| ulCount | DWORD | in | 取得する選択範囲の最大数を指定します。 |
| pSelection | TF_SELECTION* | out | 各選択範囲のデータを受け取る TF_SELECTION 構造体の配列。この配列は少なくとも ulCount 個の要素を保持できる必要があります。 |
| pcFetched | DWORD* | out | 取得した選択範囲の数を受け取る ULONG 値へのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ドキュメントに選択範囲がありません。 | |
| ec のクッキーが無効です。 | |
| コンテキストがドキュメントスタック上にありません。 | |
| 1 つ以上のパラメーターが無効です。 | |
| メモリの割り当てに失敗しました。 |
解説(Remarks)
選択範囲とは、ドキュメント内でユーザーのフォーカス領域を示す、強調表示されたテキストの範囲 (レンジ) です。範囲が空の場合は挿入位置を表します。
このメソッドが成功した場合、呼び出し元は取得したすべての TF_SELECTION 構造体の range メンバーを解放する必要があります。
通常、コンテキストがサポートする選択範囲は 1 つだけです。ただし、コンテキストが複数の選択範囲を同時にサポートすることも可能です。このメソッドを使用して複数の選択範囲を取得できます。
例
HRESULT hr;
TF_SELECTION tfSel;
ULONG uFetched;
//Obtain the default selection.
hr = pContext->GetSelection(ec, TF_DEFAULT_SELECTION, 1, &tfSel, &uFetched);
if(SUCCEEDED(hr) && (uFetched > 0))
{
//Work with the selection.
//Release the selection range object.
tfSel.range->Release();
}
ITfContext::SetSelection メソッド
| ec | DWORD | in | 編集セッションを識別する編集クッキーを格納します。これは ITfEditSession::DoEditSession に渡された値です。 |
| ulCount | DWORD | in | pSelection 配列内の選択範囲の数を指定します。 |
| pSelection | TF_SELECTION* | in | 各選択範囲の情報を格納した TF_SELECTION 構造体の配列。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ドキュメントに選択範囲がありません。 | |
| ec のクッキーが無効です。 |
解説(Remarks)
選択範囲とは、ドキュメント内でユーザーのフォーカス領域を示す、強調表示されたテキストの範囲です。範囲が空の場合は挿入位置を表します。ドキュメントによっては複数の選択範囲を持てるものもあります。pSelection 内に長さ 0 の選択範囲は 1 つしか含められません。これはドキュメントのキャレット位置を表すためです。
アプリケーションが選択範囲に含まれるテキストを調整する必要がある場合は、呼び出し元がロックを解放するまで待つ必要があります。ただし、アプリケーションは S_OK を返しつつ TF_SELECTION 構造体の style メンバーを調整できます。
呼び出し元が fInterimChar フラグを設定できるのは、選択範囲を 1 つだけ設定する場合のみです。この場合、選択範囲はちょうど 1 文字にまたがっている必要があり、TF_SELECTION 構造体の ase メンバーは TFAE_NONE に設定されます。
ITfContext::GetStart メソッド
| ec | DWORD | in | 編集セッションを識別する編集クッキーを格納します。これは ITfEditSession::DoEditSession に渡された値です。 |
| ppStart | ITfRange** | out | ドキュメントの先頭に位置する空の範囲を受け取る ITfRange インターフェイスへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ec のクッキーが無効です。 | |
| コンテキストがドキュメントスタック上にありません。 | |
| 1 つ以上のパラメーターが無効です。 | |
| コンテキストオーナーがこのメソッドを実装していません。 | |
| メモリの割り当てに失敗しました。 | |
| 原因不明のエラーが発生しました。 |
ITfContext::GetEnd メソッド
| ec | DWORD | in | 編集セッションを識別する編集クッキーを格納します。これは ITfEditSession::DoEditSession に渡された値です。 |
| ppEnd | ITfRange** | out | ドキュメントの末尾に位置する空の範囲を受け取る ITfRange インターフェイスポインターへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ec のクッキーが無効です。 | |
| コンテキストがドキュメントスタック上にありません。 | |
| 1 つ以上のパラメーターが無効です。 | |
| コンテキストオーナーがこのメソッドを実装していません。 | |
| メモリの割り当てに失敗しました。 | |
| 原因不明のエラーが発生しました。 |
ITfContext::GetActiveView メソッド
| ppView | ITfContextView** | out | アクティブなビューへの参照を受け取る ITfContextView インターフェイスポインターへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| コンテキストがドキュメントスタック上にありません。 | |
| メモリの割り当てに失敗しました。 | |
| 原因不明のエラーが発生しました。 |
| ppEnum | IEnumTfContextViews** | out | このコンテキストのビューを列挙する IEnumTfContextViews インターフェイスを受け取るポインタである。 |
ITfContext::GetStatus メソッド
| pdcs | TS_STATUS* | out | ドキュメントの状態データを受け取る TF_STATUS 構造体へのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| コンテキストがドキュメントスタック上にありません。 | |
| pdcs が無効です。 |
ITfContext::GetProperty メソッド
| guidProp | GUID* | in | プロパティ識別子を指定します。これはカスタムの識別子、または定義済みプロパティ識別子のいずれかです。 |
| ppProp | ITfProperty** | out | プロパティオブジェクトを受け取る ITfProperty インターフェイスポインターへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| コンテキストがドキュメントスタック上にありません。 | |
| 1 つ以上のパラメーターが無効です。 | |
| メモリの割り当てに失敗しました。 | |
| 原因不明のエラーが発生しました。 |
解説(Remarks)
アプリケーションやテキストサービスは、GUID で識別される独自のプロパティを定義できます。プロパティは VARIANT データとして格納されるため、独自プロパティを使用するには、呼び出し元がその形式と意味を理解している必要があります。
ITfContext::GetAppProperty メソッド
| guidProp | GUID* | in | プロパティ識別子を指定します。これはカスタムの識別子、または定義済みプロパティ識別子のいずれかです。 |
| ppProp | ITfReadOnlyProperty** | out | プロパティオブジェクトを受け取る ITfReadOnlyProperty インターフェイスポインターへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| コンテキストオーナーがこのプロパティをサポートしていません。 | |
| コンテキストがドキュメントスタック上にありません。 | |
| 1 つ以上のパラメーターが無効です。 | |
| メモリの割り当てに失敗しました。 | |
| コンテキストオーナーがこのメソッドを実装していません。 | |
| 原因不明のエラーが発生しました。 |
解説(Remarks)
アプリケーションは GUID で識別される独自のプロパティを定義できます。プロパティは VARIANT データとして格納されるため、独自プロパティを使用するには、呼び出し元がその形式と意味を理解している必要があります。
アプリケーションプロパティは、ITfContext::GetProperty で取得するテキストプロパティとは異なり、コンテキストオーナーが管理し、テキストサービスからは変更できません。アプリケーションプロパティを変更できるのはコンテキストオーナーのみです。
ITfContext::TrackProperties メソッド
| prgProp | GUID** | in | 追跡するプロパティを指定するプロパティ識別子の配列を格納します。 |
| cProp | DWORD | in | prgProp 配列内のプロパティ識別子の数を格納します。 |
| prgAppProp | GUID** | in | 追跡するアプリケーションプロパティを指定するアプリケーションプロパティ識別子の配列を格納します。 |
| cAppProp | DWORD | in | prgAppProp 配列内のアプリケーションプロパティ識別子の数を格納します。 |
| ppProperty | ITfReadOnlyProperty** | out | 追跡用プロパティを受け取る ITfReadOnlyProperty インターフェイスポインターへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| コンテキストオブジェクトがドキュメントスタック上にありません。 | |
| メモリの割り当てに失敗しました。 | |
| 1 つ以上のパラメーターが無効です。 |
解説(Remarks)
このメソッドは、複数のプロパティについて一貫したプロパティ値を持つ範囲を素早く特定するために使用します。同じ処理は ITfContext::GetProperty メソッドだけでも実現できますが、TSF マネージャーはこの処理をより高速に行えます。
このメソッドで取得されるプロパティは VT_UNKNOWN 型です。このプロパティに対して IID_IEnumTfPropertyValue を指定して QueryInterface メソッドを呼び出すと、IEnumTfPropertyValue 列挙子を取得できます。この列挙子には、prgProp および prgAppProp で指定したプロパティ値が含まれます。
例
const GUID *rgGuids[2] = { &GUID_PROP_COMPOSING,
&GUID_PROP_ATTRIBUTE };
HRESULT hr;
ITfReadOnlyProperty *pTrackProperty;
TF_SELECTION sel;
IEnumTfRanges *pEnumRanges;
ITfRange *pRangeValue;
// Get the tracking property.
hr = pContext->TrackProperties(NULL, 0, rgGuids, 2, &pTrackProperty);
// Get the selection range.
hr = pContext->GetSelection(ec, TF_DEFAULT_SELECTION, 1, &sel, &cFetched);
// Use the property from TrackProperties to get an enumeration of the ranges
// within the selection range that have the same property values.
hr = pTrackProperty->EnumRanges(ec, &pEnumRanges, sel.range);
// Enumerate the ranges of text.
while(pEnumRanges->Next(1, &pRangeValue, NULL) == S_OK)
{
VARIANT varTrackerValue;
TF_PROPERTYVAL tfPropertyVal;
IEnumTfPropertyValue *pEnumPropVal;
// Get the values for this range of text.
hr = pTrackProperty->GetValue(ec, pRangeValue, &varTrackerValue);
// Because pTrackProperties originates from TrackProperties,
// varTrackerValue can be identified as a VT_UNKNOWN/IEnumTfPropertyValue.
varTrackerValue.punkVal->QueryInterface( IID_IEnumTfPropertyValue,
(void **)&pEnumPropVal);
while(pEnumPropVal->Next(1, &tfPropertyVal, NULL) == S_OK)
{
BOOL fComposingValue;
TfGuidAtom gaDispAttrValue;
// Is this the composition property?
if (IsEqualGUID(tfPropertyVal.guidId, GUID_PROP_COMPOSING))
{
fComposingValue = (BOOL)tfPropertyVal.varValue.lVal;
}
// Or is this the attribute property?
else if (IsEqualGUID(tfPropertyVal.guidId, GUID_PROP_ATTRIBUTE))
{
gaDispAttrValue = (TfGuidAtom)tfPropertyVal.varValue.lVal;
}
// Clear the property.
VariantClear(&tfPropertyVal.varValue);
}
// Clear the tracker property.
VariantClear(&varTrackerValue);
// Release the property enumerator.
pEnumPropVal->Release();
// Release the range.
pRangeValue->Release();
}
// Release the selection range.
sel.range->Release();
ITfContext::EnumProperties メソッド
| ppEnum | IEnumTfProperties** | out | 列挙子オブジェクトを受け取る IEnumTfProperties インターフェイスポインターへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| コンテキストオブジェクトがドキュメントスタック上にありません。 | |
| メモリの割り当てに失敗しました。 | |
| ppEnum が無効です。 |
ITfContext::GetDocumentMgr メソッド
| ppDm | ITfDocumentMgr** | out | ドキュメントマネージャーを受け取る ITfDocumentMgr インターフェイスポインターへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| コンテキストがいずれのドキュメントマネージャーにも含まれていません。ppDm には NULL が設定されます。 | |
| ppDm が無効です。 |
解説(Remarks)
コンテキストがドキュメントマネージャーに含まれていない場合、このメソッドは S_FALSE を返し、ppDm には NULL が設定されます。これは、ITfDocumentMgr::Pop の呼び出しによってコンテキストがコンテキストスタックから取り除かれた場合に発生します。
ITfContext::CreateRangeBackup メソッド
| ec | DWORD | in | 編集セッションを識別する編集クッキーを格納します。これは ITfEditSession::DoEditSession に渡された値です。 |
| pRange | ITfRange* | in | バックアップ対象の ITfRange オブジェクトへのポインター。 |
| ppBackup | ITfRangeBackup** | out | pRange のバックアップを受け取る ITfRangeBackup インターフェイスポインターへのポインター。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ec のクッキーが無効です。 | |
| コンテキストがドキュメントスタック上にありません。 | |
| 1 つ以上のパラメーターが無効です。 | |
| メモリの割り当てに失敗しました。 | |
| 原因不明のエラーが発生しました。 |
解説(Remarks)
このメソッドは範囲のコピーを作成し、ITfRangeBackup::Restore でデータを復元する際に使用できるようにします。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ITfContext "{AA80E7FD-2021-11D2-93E0-0060B067B86E}" #usecom global ITfContext IID_ITfContext "{}" #comfunc global ITfContext_RequestEditSession 3 int,sptr,int,var #comfunc global ITfContext_InWriteSession 4 int,var #comfunc global ITfContext_GetSelection 5 int,int,int,var,var #comfunc global ITfContext_SetSelection 6 int,int,var #comfunc global ITfContext_GetStart 7 int,sptr #comfunc global ITfContext_GetEnd 8 int,sptr #comfunc global ITfContext_GetActiveView 9 sptr #comfunc global ITfContext_EnumViews 10 sptr #comfunc global ITfContext_GetStatus 11 var #comfunc global ITfContext_GetProperty 12 var,sptr #comfunc global ITfContext_GetAppProperty 13 var,sptr #comfunc global ITfContext_TrackProperties 14 var,int,var,int,sptr #comfunc global ITfContext_EnumProperties 15 sptr #comfunc global ITfContext_GetDocumentMgr 16 sptr #comfunc global ITfContext_CreateRangeBackup 17 int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ITfContext "{AA80E7FD-2021-11D2-93E0-0060B067B86E}" #usecom global ITfContext IID_ITfContext "{}" #comfunc global ITfContext_RequestEditSession 3 int,sptr,int,sptr #comfunc global ITfContext_InWriteSession 4 int,sptr #comfunc global ITfContext_GetSelection 5 int,int,int,sptr,sptr #comfunc global ITfContext_SetSelection 6 int,int,sptr #comfunc global ITfContext_GetStart 7 int,sptr #comfunc global ITfContext_GetEnd 8 int,sptr #comfunc global ITfContext_GetActiveView 9 sptr #comfunc global ITfContext_EnumViews 10 sptr #comfunc global ITfContext_GetStatus 11 sptr #comfunc global ITfContext_GetProperty 12 sptr,sptr #comfunc global ITfContext_GetAppProperty 13 sptr,sptr #comfunc global ITfContext_TrackProperties 14 sptr,int,sptr,int,sptr #comfunc global ITfContext_EnumProperties 15 sptr #comfunc global ITfContext_GetDocumentMgr 16 sptr #comfunc global ITfContext_CreateRangeBackup 17 int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。