1

わかりました、私はしばらくこれにいました...

ユーザーが言語バーから入力言語をいつ変更したかを追跡しようとしています。

MSDN と WinSDK のサンプルからモデル化されたテキスト サービス DLL があり、正常に登録され、インターフェイス ITfActiveLanguageProfileNotifySink と ITfLanguageProfileNotifySink を使用して、これらのイベントを正常に表示できます。

また、言語を変更すると、現在フォーカスのあるアプリケーション/プロセスに対してこれらのイベントが発生することにも最終的に気付きました。

私がする必要があるのは、フォーカスがあるときに、これらのイベントが自分のアプリケーションにコールバックできるようにすることだけです。私は何かが欠けていることを知っています。

ここで何か助けていただければ幸いです。

ありがとう。

4

1 に答える 1

1

再確認した結果、 ITfThreadMgr::Activate を呼び出さない限り、ITextStoreACPを実装せずにスレッド マネージャー オブジェクトを作成できるはずです。

したがって、コードは次のようになります。

HRESULT hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
    ITfThreadMgr* pThreadMgr(NULL);
    hr = CoCreateInstance(CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, (LPVOID*) &pThreadMgr);
    if (SUCCEEDED(hr))
    {
        ITfSource *pSource;
        hr = pThreadMgr->QueryInterface(IID_ITfSource, (LPVOID*)&pSource);
        if(SUCCEEDED(hr))
        {
            hr = pSource->AdviseSink(IID_ITfActiveLanguageProfileNotifySink, 
                (ITfActiveLanguageProfileNotifySink*)this,
                &m_dwCookie);

            pSource->Release();
        }
    }
}

または、 ITfLanguageProfileNotifySinkを使用できます。このインターフェイスは、ItfThreadMgr ではなく、ItfInputProcessorProfilesオブジェクトから駆動されます。ItfLanguageProfileNotifySinkの MSDN ページに設定方法のサンプルがあります。

両方のオブジェクトについて、アプリケーションが終了するまで、ソース オブジェクト (ITfThreadMgr または ITfInputProcessorProfiles) とシンク オブジェクト (実装したもの) を有効にしておく必要があります。

アプリケーションを終了する前に、ITfSource::UnadviseSinkを使用してソース オブジェクトからシンクを削除してから、 (Release を使用して) ソース オブジェクトを解放する必要があります。(ただし、アプリケーションの存続期間中はItfSourceインターフェースを維持する必要はありません。)

于 2013-07-29T20:16:00.147 に答える