Win32 API 日本語リファレンス
ホームUI.TextServices › ITfContext

ITfContext

COM
IIDaa80e7fd-2021-11d2-93e0-0060b067b86e継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

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。

vtbl 3 HRESULT RequestEditSession(DWORD tid, ITfEditSession* pes, TF_CONTEXT_EDIT_CONTEXT_FLAGS dwFlags, HRESULT* phrSession)

ITfContext::RequestEditSession メソッド

tidDWORDin編集セッションを確立するクライアントを識別する TfClientId 値を格納します。
pesITfEditSession*in編集セッションを実行するために呼び出される ITfEditSession インターフェイスへのポインター。
dwFlagsTF_CONTEXT_EDIT_CONTEXT_FLAGSin

次の値のうち 1 つ以上を格納します。

意味
TF_ES_ASYNCDONTCARE
編集セッションは TSF マネージャーの判断により同期・非同期のいずれでも実行できます。マネージャーはパフォーマンス向上のため、同期の編集セッションをスケジュールしようと試みます。この値は TF_ES_ASYNCTF_ES_SYNC と組み合わせることはできません。
TF_ES_SYNC
編集セッションは同期でなければならず、そうでない場合は要求が失敗します (TF_E_SYNCHRONOUS が返ります)。このフラグは、成功が見込まれるドキュメント化された状況 (キーストロークの処理など) でのみ使用してください。それ以外では呼び出しは失敗する可能性が高くなります。この値は TF_ES_ASYNCDONTCARETF_ES_ASYNC と組み合わせることはできません。
TF_ES_READ
コンテキストへの読み取り専用アクセスを要求します。
TF_ES_READWRITE
コンテキストへの読み書きアクセスを要求します。
TF_ES_ASYNC
編集セッションは非同期でなければならず、そうでない場合は要求が失敗します。この値は TF_ES_ASYNCDONTCARETF_ES_SYNC と組み合わせることはできません。
phrSessionHRESULT*out

編集セッション要求の結果を受け取る HRESULT 値のアドレス。受け取る値は要求した編集セッションの種類によって異なります。

  • 非同期の編集セッションが要求され、確立できた場合は TF_S_ASYNC を受け取ります。
  • 同期の編集セッションが要求され、確立できなかった場合は TF_E_SYNCHRONOUS を受け取ります。
  • TF_ES_READWRITE フラグが指定され、ドキュメントが読み取り専用の場合は TS_E_READONLY を受け取ります。
  • 同期の編集セッションが確立された場合は、ITfEditSession::DoEditSession の戻り値を受け取ります。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。phrSession にメソッドの詳細な結果データが格納されます。
TF_E_LOCKED
呼び出し元が、既にロックを保持している別のテキストサービスのコンテキスト内にあります。
TF_E_DISCONNECTED
コンテキストがドキュメントスタック上にありません。
E_INVALIDARG
1 つ以上のパラメーターが無効です。
E_OUTOFMEMORY
メモリの割り当てに失敗しました。

解説(Remarks)

保留中の非同期編集セッションは、受け取った順に処理されます。同期の編集セッションは、保留中の非同期編集セッションよりも先に処理されます。

テキストサービスは、既存の編集セッションのコンテキスト内で編集セッションを要求できます。ただし、読み取り専用セッション内で書き込みアクセスのセッションを要求することはできません。別のテキストサービスが確立した編集セッションのコンテキスト内でこのメソッドを呼び出すと、TF_E_LOCKED で失敗します。

同期の読み書き要求は、次の通知の処理中に行われた場合は失敗します。

vtbl 4 HRESULT InWriteSession(DWORD tid, BOOL* pfWriteSession)

ITfContext::InWriteSession メソッド

tidDWORDinクライアントを識別する TfClientID 値を格納します。
pfWriteSessionBOOL*outクライアントがコンテキストに対する読み書きロックを保持している場合に 0 以外の値を受け取る BOOL へのポインター。クライアントが編集セッションを持たない場合、または読み取り専用の編集セッションの場合は 0 を受け取ります。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
E_INVALIDARG
pfWriteSession が無効です。

解説(Remarks)

クライアントは通知コールバックの内部でこのメソッドを使用し、自身が変更を行う必要があるかどうかを判断します。

vtbl 5 HRESULT GetSelection(DWORD ec, DWORD ulIndex, DWORD ulCount, TF_SELECTION* pSelection, DWORD* pcFetched)

ITfContext::GetSelection メソッド

ecDWORDin編集セッションを識別する編集クッキーを格納します。これは ITfEditSession::DoEditSession に渡された値です。
ulIndexDWORDin取得する最初の選択範囲の 0 から始まるインデックスを指定します。既定の選択範囲を取得するには TF_DEFAULT_SELECTION を使用します。TF_DEFAULT_SELECTION を使用した場合は、選択範囲を 1 つだけ取得します。
ulCountDWORDin取得する選択範囲の最大数を指定します。
pSelectionTF_SELECTION*out各選択範囲のデータを受け取る TF_SELECTION 構造体の配列。この配列は少なくとも ulCount 個の要素を保持できる必要があります。
pcFetchedDWORD*out取得した選択範囲の数を受け取る ULONG 値へのポインター。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
TF_E_NOSELECTION
ドキュメントに選択範囲がありません。
TF_E_NOLOCK
ec のクッキーが無効です。
TF_E_DISCONNECTED
コンテキストがドキュメントスタック上にありません。
E_INVALIDARG
1 つ以上のパラメーターが無効です。
E_OUTOFMEMORY
メモリの割り当てに失敗しました。

解説(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();
}
vtbl 6 HRESULT SetSelection(DWORD ec, DWORD ulCount, TF_SELECTION* pSelection)

ITfContext::SetSelection メソッド

ecDWORDin編集セッションを識別する編集クッキーを格納します。これは ITfEditSession::DoEditSession に渡された値です。
ulCountDWORDinpSelection 配列内の選択範囲の数を指定します。
pSelectionTF_SELECTION*in各選択範囲の情報を格納した TF_SELECTION 構造体の配列。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
TF_E_NOSELECTION
ドキュメントに選択範囲がありません。
TF_E_NOLOCK
ec のクッキーが無効です。

解説(Remarks)

選択範囲とは、ドキュメント内でユーザーのフォーカス領域を示す、強調表示されたテキストの範囲です。範囲が空の場合は挿入位置を表します。ドキュメントによっては複数の選択範囲を持てるものもあります。pSelection 内に長さ 0 の選択範囲は 1 つしか含められません。これはドキュメントのキャレット位置を表すためです。

アプリケーションが選択範囲に含まれるテキストを調整する必要がある場合は、呼び出し元がロックを解放するまで待つ必要があります。ただし、アプリケーションは S_OK を返しつつ TF_SELECTION 構造体の style メンバーを調整できます。

呼び出し元が fInterimChar フラグを設定できるのは、選択範囲を 1 つだけ設定する場合のみです。この場合、選択範囲はちょうど 1 文字にまたがっている必要があり、TF_SELECTION 構造体の ase メンバーは TFAE_NONE に設定されます。

vtbl 7 HRESULT GetStart(DWORD ec, ITfRange** ppStart)

ITfContext::GetStart メソッド

ecDWORDin編集セッションを識別する編集クッキーを格納します。これは ITfEditSession::DoEditSession に渡された値です。
ppStartITfRange**outドキュメントの先頭に位置する空の範囲を受け取る ITfRange インターフェイスへのポインター。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
TF_E_NOLOCK
ec のクッキーが無効です。
TF_E_DISCONNECTED
コンテキストがドキュメントスタック上にありません。
E_INVALIDARG
1 つ以上のパラメーターが無効です。
E_NOTIMPL
コンテキストオーナーがこのメソッドを実装していません。
E_OUTOFMEMORY
メモリの割り当てに失敗しました。
E_FAIL
原因不明のエラーが発生しました。
vtbl 8 HRESULT GetEnd(DWORD ec, ITfRange** ppEnd)

ITfContext::GetEnd メソッド

ecDWORDin編集セッションを識別する編集クッキーを格納します。これは ITfEditSession::DoEditSession に渡された値です。
ppEndITfRange**outドキュメントの末尾に位置する空の範囲を受け取る ITfRange インターフェイスポインターへのポインター。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
TF_E_NOLOCK
ec のクッキーが無効です。
TF_E_DISCONNECTED
コンテキストがドキュメントスタック上にありません。
E_INVALIDARG
1 つ以上のパラメーターが無効です。
E_NOTIMPL
コンテキストオーナーがこのメソッドを実装していません。
E_OUTOFMEMORY
メモリの割り当てに失敗しました。
E_FAIL
原因不明のエラーが発生しました。
vtbl 9 HRESULT GetActiveView(ITfContextView** ppView)

ITfContext::GetActiveView メソッド

ppViewITfContextView**outアクティブなビューへの参照を受け取る ITfContextView インターフェイスポインターへのポインター。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
TF_E_DISCONNECTED
コンテキストがドキュメントスタック上にありません。
E_OUTOFMEMORY
メモリの割り当てに失敗しました。
E_FAIL
原因不明のエラーが発生しました。
vtbl 10 HRESULT EnumViews(IEnumTfContextViews** ppEnum)
ppEnumIEnumTfContextViews**outこのコンテキストのビューを列挙する IEnumTfContextViews インターフェイスを受け取るポインタである。
vtbl 11 HRESULT GetStatus(TS_STATUS* pdcs)

ITfContext::GetStatus メソッド

pdcsTS_STATUS*outドキュメントの状態データを受け取る TF_STATUS 構造体へのポインター。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
TF_E_DISCONNECTED
コンテキストがドキュメントスタック上にありません。
E_INVALIDARG
pdcs が無効です。
vtbl 12 HRESULT GetProperty(GUID* guidProp, ITfProperty** ppProp)

ITfContext::GetProperty メソッド

guidPropGUID*inプロパティ識別子を指定します。これはカスタムの識別子、または定義済みプロパティ識別子のいずれかです。
ppPropITfProperty**outプロパティオブジェクトを受け取る ITfProperty インターフェイスポインターへのポインター。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
TF_E_DISCONNECTED
コンテキストがドキュメントスタック上にありません。
E_INVALIDARG
1 つ以上のパラメーターが無効です。
E_OUTOFMEMORY
メモリの割り当てに失敗しました。
E_FAIL
原因不明のエラーが発生しました。

解説(Remarks)

アプリケーションやテキストサービスは、GUID で識別される独自のプロパティを定義できます。プロパティは VARIANT データとして格納されるため、独自プロパティを使用するには、呼び出し元がその形式と意味を理解している必要があります。

vtbl 13 HRESULT GetAppProperty(GUID* guidProp, ITfReadOnlyProperty** ppProp)

ITfContext::GetAppProperty メソッド

guidPropGUID*inプロパティ識別子を指定します。これはカスタムの識別子、または定義済みプロパティ識別子のいずれかです。
ppPropITfReadOnlyProperty**outプロパティオブジェクトを受け取る ITfReadOnlyProperty インターフェイスポインターへのポインター。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
S_FALSE
コンテキストオーナーがこのプロパティをサポートしていません。
TF_E_DISCONNECTED
コンテキストがドキュメントスタック上にありません。
E_INVALIDARG
1 つ以上のパラメーターが無効です。
E_OUTOFMEMORY
メモリの割り当てに失敗しました。
E_NOTIMPL
コンテキストオーナーがこのメソッドを実装していません。
E_FAIL
原因不明のエラーが発生しました。

解説(Remarks)

アプリケーションは GUID で識別される独自のプロパティを定義できます。プロパティは VARIANT データとして格納されるため、独自プロパティを使用するには、呼び出し元がその形式と意味を理解している必要があります。

アプリケーションプロパティは、ITfContext::GetProperty で取得するテキストプロパティとは異なり、コンテキストオーナーが管理し、テキストサービスからは変更できません。アプリケーションプロパティを変更できるのはコンテキストオーナーのみです。

vtbl 14 HRESULT TrackProperties(GUID** prgProp, DWORD cProp, GUID** prgAppProp, DWORD cAppProp, ITfReadOnlyProperty** ppProperty)

ITfContext::TrackProperties メソッド

prgPropGUID**in追跡するプロパティを指定するプロパティ識別子の配列を格納します。
cPropDWORDinprgProp 配列内のプロパティ識別子の数を格納します。
prgAppPropGUID**in追跡するアプリケーションプロパティを指定するアプリケーションプロパティ識別子の配列を格納します。
cAppPropDWORDinprgAppProp 配列内のアプリケーションプロパティ識別子の数を格納します。
ppPropertyITfReadOnlyProperty**out追跡用プロパティを受け取る ITfReadOnlyProperty インターフェイスポインターへのポインター。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
TF_E_DISCONNECTED
コンテキストオブジェクトがドキュメントスタック上にありません。
E_OUTOFMEMORY
メモリの割り当てに失敗しました。
E_INVALIDARG
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();
vtbl 15 HRESULT EnumProperties(IEnumTfProperties** ppEnum)

ITfContext::EnumProperties メソッド

ppEnumIEnumTfProperties**out列挙子オブジェクトを受け取る IEnumTfProperties インターフェイスポインターへのポインター。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
TF_E_DISCONNECTED
コンテキストオブジェクトがドキュメントスタック上にありません。
E_OUTOFMEMORY
メモリの割り当てに失敗しました。
E_INVALIDARG
ppEnum が無効です。
vtbl 16 HRESULT GetDocumentMgr(ITfDocumentMgr** ppDm)

ITfContext::GetDocumentMgr メソッド

ppDmITfDocumentMgr**outドキュメントマネージャーを受け取る ITfDocumentMgr インターフェイスポインターへのポインター。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
S_FALSE
コンテキストがいずれのドキュメントマネージャーにも含まれていません。ppDm には NULL が設定されます。
E_INVALIDARG
ppDm が無効です。

解説(Remarks)

コンテキストがドキュメントマネージャーに含まれていない場合、このメソッドは S_FALSE を返し、ppDm には NULL が設定されます。これは、ITfDocumentMgr::Pop の呼び出しによってコンテキストがコンテキストスタックから取り除かれた場合に発生します。

vtbl 17 HRESULT CreateRangeBackup(DWORD ec, ITfRange* pRange, ITfRangeBackup** ppBackup)

ITfContext::CreateRangeBackup メソッド

ecDWORDin編集セッションを識別する編集クッキーを格納します。これは ITfEditSession::DoEditSession に渡された値です。
pRangeITfRange*inバックアップ対象の ITfRange オブジェクトへのポインター。
ppBackupITfRangeBackup**outpRange のバックアップを受け取る ITfRangeBackup インターフェイスポインターへのポインター。

戻り値

このメソッドは次のいずれかの値を返します。

説明
S_OK
メソッドは成功しました。
TF_E_NOLOCK
ec のクッキーが無効です。
TF_E_DISCONNECTED
コンテキストがドキュメントスタック上にありません。
E_INVALIDARG
1 つ以上のパラメーターが無効です。
E_OUTOFMEMORY
メモリの割り当てに失敗しました。
E_FAIL
原因不明のエラーが発生しました。

解説(Remarks)

このメソッドは範囲のコピーを作成し、ITfRangeBackup::Restore でデータを復元する際に使用できるようにします。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。