淺析輸入法原理

       首先我們要知道什麼是輸入法,我們經常用輸入法,但是你發現一個現象沒有?,在任務管理器中並沒有看到輸入法進程。當然了搜狗那種流氓軟件除外,說不定正在後臺做什麼偷偷摸摸的事情,當然要創建進程。輸入法的核心文件你找到安裝目錄就會發現一個後綴是.ime的文件,你用十六進制查看器看看就會發現他其實是一個類似dll的模塊,當一個進程打開輸入法要輸入漢字的時候其實就是載入了這個模塊,如下圖:

在這個模塊裏進行文字的接收,處理,發送。

一.Windows 9x系統

       系統的鍵盤事件有windows的user.exe軟件接收後,user.exe在將鍵盤事件傳導輸入法管理器(Input MethodManager,簡稱IMM)中,管理器 再將鍵盤事件傳到輸入法中,輸入法根據用戶編碼字典,翻譯鍵盤事件爲對應的漢字(或漢字串),然後再反傳到user.exe中,user.exe再將翻譯後的鍵盤事件傳給當前正運行的應用程序,從而完成漢字的輸入。這個是windows 9x系統下的。

 

二,windows NT系統

       這個是重點。

       Windows XP系統下的輸入法和9x系統的輸入法有很大區別,對輸入法的處理完全不同。這個是我花了一下午和一位論壇好友交流的結果,說是交流,其實就是他單向傳授與我,呵呵。廢話不多說,我們開始。

先看一段程序

while((r=GetMessageW(&msg,0,0,0))!=-1)

{

if(r==0)break;

TranslateMessage(&msg);

     DispatchMessageW(&msg);

}

       這是一個消息循環,直到r等於0,表示有WM_QUIT,r=-1表示出錯,是系統從消息隊列中取消息的一般過程。那麼輸入法是怎麼回事呢?

       一般情況下GetMessage得到WM_KEYDOWN的wParam是虛擬鍵碼,如果我們開了輸入法,WM_KEYDOWN的wParam虛擬碼是VK_PROCESSKEY,TranslateMessage對一般的虛擬鍵碼是產生WM_CHAR,WM_SYSCHAR之類的,但是當TranslateMessage遇到了VK_PROCESSKEY,就會有特殊處理。這時候TranslateMessage就會把控制權交給DefWindowProc這個缺省的消息處理例程,DefWindowProc再通知輸入法程序的窗口,把那些候選的顯示出來,當你的你輸入法將接受到的虛擬碼做一系列轉換以後合成相應的漢字,輸入法再將合成好的WM_CHAR用PostMess插入消息隊列,Edit控件接受WM_CHAR顯示字符。

       如果你沒有開輸入法WM_CHAR直接由 TranslateMessage產生。

流程圖如下:

 

有好東西不忘和大家分享一下,呵呵。

這種說法肯定有許多錯誤和不足,畢竟我是菜鳥,歡迎指正。

最後一句,菜鳥言論,僅供娛樂。

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