一、背景:
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用於激活對應輸入法。
五、代碼:
- BOOL CXX::PreTranslateMessage(MSG* pMsg)
- {
- if ( pMsg->message == WM_INPUTLANGCHANGEREQUEST)
- {
- HKL hkl = (HKL)pMsg->lParam;
- ActivateKeyboardLayout(hkl, KLF_REPLACELANG);//激活對應輸入法
- return TRUE;
- }
- }