好吧,我已经做了一段时间了。。。
我正在尝试跟踪用户何时从语言栏更改输入语言。
我有一个文本服务DLL-从MSDN和WinSDK样本中建模-注册良好,并且我可以使用接口ITfActiveLanguageProfileNotifySink&ITfLanguageProfileNotifySink并查看这些事件。
我还最终意识到,当我更改语言时,这些事件会发生在当前关注的应用程序/进程上。
我需要做的只是让这些事件能够在我自己的应用程序有焦点时回调到它。我知道我错过了什么。
感谢您的帮助。
谢谢。
我做了一些双重检查,只要不调用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();
}
}
}
或者,您可以使用ITfLanguageProfileNotifySsink-此接口是从ItfInputProcessorProfiles对象而不是ItfThreadMgr驱动的。MSDN页面上有一个ItfLanguageProfileNotifySsink的设置示例。
对于这两个对象,您需要保持源对象(ITfThreadMgr或ITfInputProcessorProfiles)和接收器对象(您实现的对象)的活动状态,直到您的应用程序退出。
在应用程序退出之前,需要使用ITfSource::UnadviseSink从源对象中删除接收器,然后释放源对象(使用release)。(不过,您不需要在应用程序的整个生命周期内保持ItfSource接口的活力。)