日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转载】浅析输入法原理

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】浅析输入法原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????? 首先我們要知道什么是輸入法,我們經常用輸入法,但是你發現一個現象沒有?,在任務管理器中并沒有看到輸入法進程。當然了搜狗那種流氓軟件除外,說不定正在后臺做什么偷偷摸摸的事情,當然要創建進程。輸入法的核心文件你找到安裝目錄就會發現一個后綴是.ime的文件,你用十六進制查看器看看就會發現他其實是一個類似dll的模塊,當一個進程打開輸入法要輸入漢字的時候其實就是載入了這個模塊,如下圖:

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

一.Windows 9x系統

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

二,windows NT系統

?????? 這個是重點。

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

先看一段程序

[cpp] view plaincopyprint?
  • while((r=GetMessageW(&msg,0,0,0))!=-1)?
  • ?
  • {?
  • ?
  • if(r==0)break;?
  • ?
  • TranslateMessage(&msg);?
  • ?
  • ???? DispatchMessageW(&msg);?
  • ?
  • }?
  • 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產生。

    流程圖如下:

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

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

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

    總結

    以上是生活随笔為你收集整理的【转载】浅析输入法原理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。