2013-07-22 47 views
0

當我試圖附加到文本服務上下文外的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方法執行時間,有重點寫字板。

該程序得到儘可能遠的嘗試獲取當前重點ITfDocumentMgrITfThreadMgr :: GetFocus),但返回的文檔管理器爲NULL。根據API文檔,這意味着當前沒有集中ITfDocumentMgr,但是:

如果我採取完全不同的辦法:註冊一個自定義文本服務,並通過ITfTextInputProcessor::Activate收到ITfThreadMgr參考,我能夠檢索聚焦ITfDocumentMgr爲寫字板通過ITfThreadMgr :: GetFocus。但由於各種原因,我寧願不安裝自定義的inproc文本服務。

是否有任何方法可以通過進程邊界掛接到TSF API,如AutomationElement.FocusedElement,IUIAutomation::GetFocusedElementAccessibleObjectFromWindow所示?

回答

1

文本服務框架不能跨越進程。沒有代理和存根可用。抱歉。

順便提一句,您的代碼正在嘗試獲取您的進程的焦點文檔管理器。您使用CLSCTX_INPROC_SERVER創建ITfThreadMgr,它啓動線程管理器進程,不在目標中。