HRESULT CCompartmentEventSink::_Advise(_In_ IUnknown *punk, _In_ REFGUID guidCompartment) { HRESULT hr = S_OK; ITfCompartmentMgr* pCompartmentMgr = nullptr; ITfSource* pSource = nullptr; hr = punk->QueryInterface(IID_ITfCompartmentMgr, (void **)&pCompartmentMgr); if (FAILED(hr)) { return hr; } hr = pCompartmentMgr->GetCompartment(guidCompartment, &_pCompartment); if (SUCCEEDED(hr)) { hr = _pCompartment->QueryInterface(IID_ITfSource, (void **)&pSource); if (SUCCEEDED(hr)) { hr = pSource->AdviseSink(IID_ITfCompartmentEventSink, this, &_dwCookie); pSource->Release(); } } pCompartmentMgr->Release(); return hr; }
HRESULT CCompartment::_GetCompartment(_Outptr_ ITfCompartment **ppCompartment) { HRESULT hr = S_OK; ITfCompartmentMgr* pCompartmentMgr = nullptr; hr = _punk->QueryInterface(IID_ITfCompartmentMgr, (void **)&pCompartmentMgr); if (SUCCEEDED(hr)) { hr = pCompartmentMgr->GetCompartment(_guidCompartment, ppCompartment); pCompartmentMgr->Release(); } return hr; }
HRESULT CCompartment::_ClearCompartment() { if (IsEqualGUID(_guidCompartment, GUID_COMPARTMENT_KEYBOARD_OPENCLOSE)) { return S_FALSE; } HRESULT hr = S_OK; ITfCompartmentMgr* pCompartmentMgr = nullptr; if ((hr = _punk->QueryInterface(IID_ITfCompartmentMgr, (void **)&pCompartmentMgr)) == S_OK) { hr = pCompartmentMgr->ClearCompartment(_tfClientId, _guidCompartment); pCompartmentMgr->Release(); } return hr; }
HRESULT CTextService::_SetKeyboardOpen(BOOL fOpen) { HRESULT hr = E_FAIL; ITfCompartmentMgr *pCompMgr = NULL; if (_pThreadMgr->QueryInterface(IID_ITfCompartmentMgr, (void **)&pCompMgr) == S_OK) { ITfCompartment *pCompartment; if (pCompMgr->GetCompartment(GUID_COMPARTMENT_KEYBOARD_OPENCLOSE, &pCompartment) == S_OK) { VARIANT var; var.vt = VT_I4; var.lVal = fOpen; hr = pCompartment->SetValue(_tfClientId, &var); } pCompMgr->Release(); } return hr; }
BOOL CTextService::_IsKeyboardOpen() { ITfCompartmentMgr *pCompMgr = NULL; BOOL fOpen = FALSE; if (_pThreadMgr->QueryInterface(IID_ITfCompartmentMgr, (void **)&pCompMgr) == S_OK) { ITfCompartment *pCompartment; if (pCompMgr->GetCompartment(GUID_COMPARTMENT_KEYBOARD_OPENCLOSE, &pCompartment) == S_OK) { VARIANT var; if (S_OK == pCompartment->GetValue(&var)) { if (var.vt == VT_I4) // Even VT_EMPTY, GetValue() can succeed { fOpen = (BOOL)var.lVal; } } } pCompMgr->Release(); } return fOpen; }
BOOL CTextService::_IsKeyboardDisabled() { ITfCompartmentMgr *pCompMgr = NULL; ITfDocumentMgr *pDocMgrFocus = NULL; ITfContext *pContext = NULL; BOOL fDisabled = FALSE; if ((_pThreadMgr->GetFocus(&pDocMgrFocus) != S_OK) || (pDocMgrFocus == NULL)) { // if there is no focus document manager object, the keyboard // is disabled. fDisabled = TRUE; goto Exit; } if ((pDocMgrFocus->GetTop(&pContext) != S_OK) || (pContext == NULL)) { // if there is no context object, the keyboard is disabled. fDisabled = TRUE; goto Exit; } if (pContext->QueryInterface(IID_ITfCompartmentMgr, (void **)&pCompMgr) == S_OK) { ITfCompartment *pCompartmentDisabled; ITfCompartment *pCompartmentEmptyContext; // Check GUID_COMPARTMENT_KEYBOARD_DISABLED. if (pCompMgr->GetCompartment(GUID_COMPARTMENT_KEYBOARD_DISABLED, &pCompartmentDisabled) == S_OK) { VARIANT var; if (S_OK == pCompartmentDisabled->GetValue(&var)) { if (var.vt == VT_I4) // Even VT_EMPTY, GetValue() can succeed { fDisabled = (BOOL)var.lVal; } } pCompartmentDisabled->Release(); } // Check GUID_COMPARTMENT_EMPTYCONTEXT. if (pCompMgr->GetCompartment(GUID_COMPARTMENT_EMPTYCONTEXT, &pCompartmentEmptyContext) == S_OK) { VARIANT var; if (S_OK == pCompartmentEmptyContext->GetValue(&var)) { if (var.vt == VT_I4) // Even VT_EMPTY, GetValue() can succeed { fDisabled = (BOOL)var.lVal; } } pCompartmentEmptyContext->Release(); } pCompMgr->Release(); } Exit: if (pContext) pContext->Release(); if (pDocMgrFocus) pDocMgrFocus->Release(); return fDisabled; }
HRESULT CCompartmentMonitor::Initialize( const GUID *pguidCompartment, PCOMPARTMENTMONITORPROC pCallback, LPARAM lParam) { if(!IsEqualGUID(m_guidCompartment, GUID_NULL)) { //Initialize() has already been called return E_UNEXPECTED; } m_guidCompartment = *pguidCompartment; m_pCallback = pCallback; m_lParam = lParam; HRESULT hr; ITfThreadMgr *pThreadMgr; //create a thread manager object hr = CoCreateInstance(CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, (void**)&pThreadMgr); if(SUCCEEDED(hr)) { ITfCompartmentMgr *pCompMgr; //get the global compartment manager hr = pThreadMgr->GetGlobalCompartment(&pCompMgr); if(SUCCEEDED(hr)) { //get the Speech UI compartment hr = pCompMgr->GetCompartment(m_guidCompartment, &m_pCompartment); if(SUCCEEDED(hr)) { ITfSource *pSource; //install the advise sink hr = m_pCompartment->QueryInterface(IID_ITfSource, (LPVOID*)&pSource); if(SUCCEEDED(hr)) { hr = pSource->AdviseSink(IID_ITfCompartmentEventSink, (ITfCompartmentEventSink*)this, &m_dwCookie); } //if something went wrong, release the member interface if(FAILED(hr)) { m_pCompartment->Release(); m_pCompartment = NULL; } } //release the compartment manager pCompMgr->Release(); } //release the thread manager pThreadMgr->Release(); } return hr; }