Htmlayout對話框程序輸入法切換問題解決方案

一、背景:

    Htmlayout的附載容器是dialog時候中文無法輸入(無法切換輸入法程序),包括SDK中封裝的dialog類。

二、原因:

    1、調用的某個dll(初步懷疑是Htmlayout.dll)攔截了輸入法消息,但是沒有將輸入法消息釋放出來給界面線程處理;

    2、Htmlayout窗口本身未能激活輸入法消息;

    結論:因爲這種情況只出現在dialog中,而非模態窗口一切正常。故MS可能在dialog內部做了什麼齷齪的事情。原因1不可靠!

三、WM_INPUTLANGCHANGEREQUEST

    解釋:當用戶選擇某種輸入語言,或輸入語言的熱鍵改變。

四、網述機制:

   【那麼輸入法具體機制又是怎麼的呢?Windows的輸入法其實就是一個系統目錄下的IME文件,IME文件其實就是一個特殊的DLL,它必須具有輸入法程序所規定的那些接口。輸入法是由輸入法管理器(imm32.dll)控制的,輸入法管理器又是由user32.dll控制的。當在應用程序中通過鼠標或者鍵盤(user32.dll捕獲這些事件)激活某個輸入法時,輸入法管理器就會在那個應用程序的進程中加載對應的IME文件,加載IME文件跟加載普通的DLL並沒有本質區別,所以,我們可以認爲,輸入法其實就是載入到應用程序中的一個DLL文件。在切換輸入法之前輸入法文件並不會被載入,切換輸入法之後OS向系統中的獲得焦點的窗口POST一條WM_INPUTLANGCHANGEREQUEST消息,該消息可以在窗口的後臺激活輸入法,如果某個窗口自動激活失敗,就需要在那個窗口中手工切換輸入法,這樣才能將輸入法文件載入進去】。

    系統發送WM_INPUTLANGCHANGEREQUEST消息時會附帶參數lParam,lParam代表切換後的輸入法標識。此標識可以被ActivateKeyboardLayout作爲參數使用,ActivateKeyboardLayout用於激活對應輸入法。

五、代碼:

  1. BOOL CXX::PreTranslateMessage(MSG* pMsg)   
  2. {  
  3.     if ( pMsg->message == WM_INPUTLANGCHANGEREQUEST)  
  4.     {  
  5.         HKL hkl  = (HKL)pMsg->lParam;  
  6.         ActivateKeyboardLayout(hkl, KLF_REPLACELANG);//激活對應輸入法    
  7.          return TRUE;  
  8.     }   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章