// ITfTextInputProcessor STDMETHODIMP TextService::Activate(ITfThreadMgr *pThreadMgr, TfClientId tfClientId) { // store tsf manager & client id threadMgr_ = pThreadMgr; clientId_ = tfClientId; activateFlags_ = 0; ComQIPtr<ITfThreadMgrEx> threadMgrEx = threadMgr_; if(threadMgrEx) { threadMgrEx->GetActiveFlags(&activateFlags_); } // advice event sinks (set up event listeners) // ITfThreadMgrEventSink, ITfActiveLanguageProfileNotifySink ComQIPtr<ITfSource> source = threadMgr_; if(source) { source->AdviseSink(IID_ITfThreadMgrEventSink, (ITfThreadMgrEventSink *)this, &threadMgrEventSinkCookie_); source->AdviseSink(IID_ITfActiveLanguageProfileNotifySink, (ITfActiveLanguageProfileNotifySink *)this, &activateLanguageProfileNotifySinkCookie_); } // ITfTextEditSink, // ITfKeyEventSink ComQIPtr<ITfKeystrokeMgr> keystrokeMgr = threadMgr_; if(keystrokeMgr) keystrokeMgr->AdviseKeyEventSink(clientId_, (ITfKeyEventSink*)this, TRUE); // register preserved keys if(!preservedKeys_.empty()) { vector<PreservedKey>::iterator it; for(it = preservedKeys_.begin(); it != preservedKeys_.end(); ++it) { PreservedKey& preservedKey = *it; keystrokeMgr->PreserveKey(clientId_, preservedKey.guid, &preservedKey, NULL, 0); } } // ITfCompositionSink // ITfCompartmentEventSink // get current keyboard state if(!compartmentMonitors_.empty()) { vector<CompartmentMonitor>::iterator it; for(it = compartmentMonitors_.begin(); it != compartmentMonitors_.end(); ++it) { ComQIPtr<ITfSource> compartmentSource; if(it->isGlobal) // global compartment compartmentSource = globalCompartment(it->guid); else // thread specific compartment compartmentSource = threadCompartment(it->guid); compartmentSource->AdviseSink(IID_ITfCompartmentEventSink, (ITfCompartmentEventSink*)this, &it->cookie); } } isKeyboardOpened_ = threadCompartmentValue(GUID_COMPARTMENT_KEYBOARD_OPENCLOSE); // FIXME: under Windows 7, it seems that the keyboard is closed every time // our text service is activated. The value in the compartment is always empty. :-( // So, we open the keyboard manually here, but I'm not sure if this is the correct behavior. if(!isKeyboardOpened_) setKeyboardOpen(true); // initialize language bar ::CoCreateInstance(CLSID_TF_LangBarMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfLangBarMgr, (void**)&langBarMgr_); if(langBarMgr_) { langBarMgr_->AdviseEventSink(this, NULL, 0, &langBarSinkCookie_); } // Note: language bar has no effects in Win 8 immersive mode if(!langBarButtons_.empty()) { ComPtr<ITfLangBarItemMgr> langBarItemMgr; if(threadMgr_->QueryInterface(IID_ITfLangBarItemMgr, (void**)&langBarItemMgr) == S_OK) { for(vector<LangBarButton*>::iterator it = langBarButtons_.begin(); it != langBarButtons_.end(); ++it) { LangBarButton* button = *it; langBarItemMgr->AddItem(button); } } } onActivate(); //::MessageBox(0, L"onActivate", 0, 0); return S_OK; }