當我試圖附加到文本服務上下文外的Microsoft Text Services Framework(TSF)時,我無法檢索到需要與該文本服務交互的信息活躍應用程序的文本。Microsoft TSF - 使用ITfThreadMgr :: GetFocus像IUIAutomation :: GetFocusedElement
#include <SDKDDKVer.h>
#include <stdio.h>
#include <tchar.h>
#include <msctf.h>
#include <atlbase.h>
#include <iostream>
// Macro throws a descriptive WCHAR* exception if(FAILED(hr))
#define OK(hrExpr) do{std::cout<<"IN: "<<#hrExpr<<std::endl; HRESULT returnCode = hrExpr; if(FAILED(returnCode)){std::cout<<std::endl<<"ERROR! "<<#hrExpr<<" @"<<__FILE__<<":"<<__LINE__<<" returned "<<returnCode<<std::endl; throw L#hrExpr; }else{std::cout << "OK: " << #hrExpr << std::endl;}}while(0)
int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(0);
ITfThreadMgr* pThreadMgr = NULL;
TfClientId clientId = NULL;
ITfDocumentMgr* docMgr = NULL;
ITfContext* pContext = NULL;
try
{
std::cout << "Use the next 5 seconds to switch to a TSF-enabled application and make a text selection." << std::endl;
Sleep(5000);
OK(CoCreateInstance( CLSID_TF_ThreadMgr,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITfThreadMgr,
(void**)&pThreadMgr));
OK(pThreadMgr->Activate(&clientId));
OK(pThreadMgr->GetFocus(&docMgr));
if (docMgr == NULL)
{
throw L"NULL document manager";
}
OK(docMgr->GetTop(&pContext));
// TODO: use ITfContext to get selection or make document edits
}
catch(LPCSTR msg)
{
std::wcout << L"Exception: " << msg << std::endl;
}
catch(LPCWSTR msg)
{
std::wcout << L"Exception: " << msg << std::endl;
}
if (pContext)
pContext->Release();
if (docMgr)
docMgr->Release();
::CoUninitialize();
return 0;
}
我使用寫字板在Windows 7上我的目標測試應用程序,我要確保由TSF方法執行時間,有重點寫字板。
該程序得到儘可能遠的嘗試獲取當前重點ITfDocumentMgr(ITfThreadMgr :: GetFocus),但返回的文檔管理器爲NULL。根據API文檔,這意味着當前沒有集中ITfDocumentMgr,但是:
如果我採取完全不同的辦法:註冊一個自定義文本服務,並通過ITfTextInputProcessor::Activate收到ITfThreadMgr參考,我能夠檢索聚焦ITfDocumentMgr爲寫字板通過ITfThreadMgr :: GetFocus。但由於各種原因,我寧願不安裝自定義的inproc文本服務。
是否有任何方法可以通過進程邊界掛接到TSF API,如AutomationElement.FocusedElement
,IUIAutomation::GetFocusedElement
或AccessibleObjectFromWindow
所示?