2013-07-26 12 views
1

OK 텍스트 서비스 프레임 워크 DLL을 통해 입력 언어의 변화를 감지하지, 나는 ...이 잠시 동안 있었다.응용 프로그램

MSDN 및 WinSDK 샘플로 모델링 한 텍스트 서비스 DLL이 있는데 잘 등록되며 ITfActiveLanguageProfileNotifySink & ITfLanguageProfileNotifySink 인터페이스를 사용할 수 있습니다. 이러한 이벤트는 잘 보입니다.

나는 또한 언어를 변경할 때 이러한 이벤트가 현재 포커스가있는 응용 프로그램/프로세스에서 발생한다는 것을 깨달았습니다.

내가해야 할 일은 포커스가있을 때 이러한 이벤트를 내 응용 프로그램에 콜백 할 수있게하는 것입니다. 나는 뭔가를 놓친다는 것을 안다.

여기에 도움을 주시면 감사하겠습니다.

감사합니다.

+0

어떤 운영 체제입니까? XP에서 Windows 7까지, 언어 변경은 프로세스마다 있습니다. Windows 8에서 언어 변경은 전역 적입니다. –

+0

Eric - Windows 7입니다. 응용 프로그램이 등록 된 텍스트 서비스에 대해 이러한 콜백을 수신하려면 어떻게해야합니까? 내 텍스트 서비스 개체는 사용자 지정 인터페이스뿐만 아니라이 두 싱크에서 파생됩니다. 내 응용 프로그램에서 스레드 관리자를 얻을 수 있지만, 그 후에 그것은 내 응용 프로그램에서 이러한 이벤트를 볼 수없는 무슨 상관이 보인다. 예를 들어, 텍스트 객체에 창 핸들을 전달하여 콜백하도록하면이 핸들은 내 애플리케이션에 포커스가 있어도 유효하지 않은 것처럼 보입니다. – user2621234

+1

안녕, 멋진 블로그! 그것은 내가 찾은 가장 유용한 자료였습니다. – user2621234

답변

1

두 번 확인해 보았습니다. 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(); 
     } 
    } 
} 

는 다른 방법으로, ITfLanguageProfileNotifySink을 사용할 수 있습니다 -이 인터페이스 대신 ItfThreadMgr의 ItfInputProcessorProfiles 개체에서 구동 : 같은

그래서, 코드가 보일 것입니다. MSDN page for ItfLanguageProfileNotifySink에서 설정하는 방법에 대한 샘플이 있습니다.

두 개체 모두 응용 프로그램이 종료 될 때까지 원본 개체 (ITfThreadMgr 또는 ITfInputProcessorProfiles)와 싱크 개체 (구현 한 개체)를 유지해야합니다.

응용 프로그램이 종료되기 전에 소스 개체에서 ITfSource::UnadviseSink을 사용하여 싱크를 제거한 다음 원본 개체를 해제해야합니다 (릴리스를 사용하여). (그러나 응용 프로그램의 수명 동안 ItfSource 인터페이스를 활성 상태로 유지할 필요가 없습니다.)

+0

에릭 - 덕분에, 내 텍스트 서비스 등록없이 응용 프로그램에서 작동하도록했습니다. ITfLanguageProfileNotifySink 인터페이스는 언어 바에서 입력 언어를 변경할 때 LANGID를 얻는 것처럼 더 적합합니다. 그러나 고객이 주목 한 문제는 다음과 같습니다. ChangJie 또는 New Phonetic과 같이 중국어 (하위) 언어를 변경할 때 이러한 알림이 표시되지 않는 이유는 무엇입니까? 다시 한 번 감사드립니다! – user2621234

+1

@ user2621234 - 하위 언어가 아니며 입력 방법입니다. 동일한 언어에 대해 여러 입력기를 사용할 수 있습니다. 입력 방법을 추적하려면 [ITfActiveLanguageProfileNotifySink] (http://msdn.microsoft.com/en-us/library/ms538491.aspx)를 사용하고 다양한 입력 방법에 대한 CLSID를 해석하는 방법을 찾아야합니다. –