近日在開發類似qq螢幕截圖過程中,發現在輸入文字時切換輸入法(ctrl+shift)時,會導致程式出現「卡死」現象。為了方便**重用,螢幕截圖模組是以動態庫方式封裝起來的。出現「卡死」現象後,只能通過任務管理器強制殺掉對應的程序才能退出程式。於是,上網搜尋了相關話題,發現原因通常是某種輸入法如紫光或搜狗輸入法導致了程式宕機,也可能是某種軟體與輸入法衝突導致宕機。
通過**注釋最終找到了問題所在,可能在程式呼叫的某個dll庫中截獲了輸入法訊息,但是沒有將輸入法訊息釋放出來給介面執行緒處理導致介面掛死。
那麼輸入法具體機制又是怎麼的呢?windows的輸入法其實就是乙個系統目錄下的ime檔案,ime檔案其實就是乙個特殊的dll,它必須具有輸入法程式所規定的那些介面。輸入法是由輸入法管理器(imm32.dll)控制的,輸入法管理器又是由user32.dll控制的。當在應用程式中通過滑鼠或者鍵盤(user32.dll捕獲這些事件)啟用某個輸入法時,輸入法管理器就會在那個應用程式的程序中載入對應的ime檔案,載入ime檔案跟載入普通的dll並沒有本質區別,所以,我們可以認為,輸入法其實就是載入到應用程式中的乙個dll檔案。在切換輸入法之前輸入法檔案並不會被載入,切換輸入法之後os向系統中的獲得焦點的視窗post一條wm_inputlangchangerequest訊息,該訊息可以在視窗的後台啟用輸入法,如果某個視窗自動啟用失敗,就需要在那個視窗中手工切換輸入法,這樣才能將輸入法檔案載入進去。微軟對傳送wm_inputlangchangerequest訊息時機的解釋是:當使用者選擇某種輸入語言,或輸入語言的熱鍵改變。
系統傳送wm_inputlangchangerequest訊息時會附帶引數lparam,lparam代表切換後的輸入法標識。此標識可以被activatekeyboardlayout作為引數使用,activatekeyboardlayout用於啟用對應輸入法。**如下:
hkl hkl = (hkl)pmsg->lparam;
activatekeyboardlayout(hkl, klf_replacelang);//啟用對應輸入法
主線程啟用對應輸入法之後,需要返回true,不讓其它執行緒處理輸入法訊息,避免出現卡死現象。具體的解決辦法:只需在你的主線程訊息入口新增如下**即可: }
eclipse與scim輸入法衝突解決辦法
ubuntu 8.04下的eclipse與scim輸入法衝突解決辦法 活在蛋殼裡 2008 07 20 12 12 最近把系統公升級到8.04,整個安裝配置過程越來越簡單,一切都比較順利,最後在eclipse與scim之間卡住了。我安裝的是英文環境,locale是en us.utf 8,同樣的方法在...
XP下切換輸入法造成程式卡死的原因及解決方案
by ysai 現象 在xp下,如果執行緒中建立了視窗而執行緒中沒有訊息迴圈,那麼可能切換輸入法時會造成程式卡死 某些xp下必現,跟安裝盤有關 原因 執行緒建立乙個視窗後,系統會自動建立乙個default ime視窗以便通知輸入法訊息 可能只有可以接收輸入的視窗才會建立,未證實 xp下切換輸入法,會...
解決在MAC上輸入法切換慢的問題
1.常用 2.按鍵 3.拼音 4.高階 自動更新 不啟用 自動切換英文 不啟用 目的是為了讓軟體少幹點活,幹活越多就越慢。1.進入 系統偏好設定 鍵盤 快捷鍵 輸入法 設定如下快捷鍵 勾選 select the previous input source,並設定快捷鍵為 option command...