Win下的輸入法(IME)程式設計(1)

2021-06-04 18:36:45 字數 2794 閱讀 6568

·win

下的輸入法程式設計方法

在win

下編寫輸入法主要可以採用外掛程式式和

ime方式兩種:

·外掛程式式的實現核心是通過鍵盤鉤子對輸入進行攔截,再把要輸出的內容傳送給處於活動狀態的編輯視窗。

·ime

方式則是使用系統提供的

ime(

input method editor

)介面實現輸入法。

頭一種方法自己並未接觸過,但使用鉤子技術在相容性上來說總是有點不足的(遇上防鉤子的程式,輸入法就沒轍了),再者,把要輸出的內容傳送給處於活動狀態的輸入焦點處並不總能成功(對win

下的api

了解不多,這裡或許有誤)。既然系統已經為我們編寫輸入法專門弄了個

ime出來,那當然還是直接用系統的好些啦。

·ime

介紹

ime的實現原理可用下圖簡單的表述:

-------------------------------

鍵盤事件  應用程式

↓      ↑

windows的

user.exe

↓      ↑

輸入法管理器(ime)

↓  ↑

輸入法-------------------------------

當當前活動視窗開啟了輸入法後,鍵盤事件就會通過系統程序user.exe

轉交給ime

處理,ime

再轉告給當前輸入法,輸入法處理完後把處理結果告知

ime,

ime根據這個處理結果決定反饋給

user.exe

,然後再反饋給當前應用程式的活動視窗。

基於ime

開發的輸入法檔案字尾為「

ime」,但實際上是乙個

dll檔案。這個

dll檔案類似於

ime的乙個外掛程式存在,實現了

ime要求的十幾個介面函式。實際上,當

ime收到

user.exe

發來的鍵盤事件時,

ime就會呼叫當前啟動的輸入法中某些

ime介面函式,根據這些函式的返回值,

ime可以確定輸入法是否打算處理當前的鍵盤輸入(選擇不處理的情況下該鍵盤事件將會送去給應用程式自己去處理,否則應用程式不會收到該鍵盤事件),或把輸入法要求輸出的內容輸出到應用程式中。

·系統對輸入法資訊的儲存

ime輸入法的資訊儲存在登錄檔中,位置有兩個:

·hkey_local_machine\\system\\currentcontrolset\\control\\keyboard layouts

這裡儲存了所有當前系統已安裝的輸入法的基本資訊,這裡要特別說明一下:已安裝的輸入法並不僅僅是指在語言欄裡能直接看到,能用熱鍵切換的輸入法,還包括安裝了但未在語言欄中啟動的那些,這些未啟用的輸入法可以在語言欄的設定->按[

新增]按鈕彈出的視窗中找到。

在這個登錄檔項下是一堆以英文和數字組成的8

位字串命名的子項(實際應該理解為乙個8位的

16進製制數,為輸入法的鍵盤布局唯一標識號),這裡每乙個子項代表的就是乙個已安裝的輸入法。而這些子項的字串的後

4位代表了該輸入法所屬的語言,這個值具體的意義可從「hkey_local_machine\\system\\currentcontrolset\\control\\keyboard layout\\doskeybcodes」項裡面的值裡查到,而前4

位則僅表示乙個安裝序號,以保證每個輸入法項的這個

8位字串都是唯一的,每當有新的輸入法通過系統提供的方法安裝進來,系統就會找出與要安裝的輸入法同一語言的輸入法中最大使用到的安裝序號,新安裝的輸入法則在這個安裝序號基礎上

+1,如果安裝是完全通過自行寫入登錄檔的方式完成的,則只要保證字串後

4位值滿足要求且整個

8位字串值惟一也行,不過還是建議使用系統提供的方法安裝(具體操作文章稍後的地方有講)。

舉個例子,假如當前系統剛通過系統提供的方法安裝了乙個新輸入法,其安裝好後的輸入法項為「00060804

」,則根據後4位「

0804

」可以查到,這個輸入法的語言是屬於中文的,而前4位「

0006

」則為其安裝序號,假設現在有乙個新的中文輸入法要通過系統提供的方法安裝進來,則這個新輸入法安裝完後所分配的項應該為「

00070804」。

在對於非系統的輸入法項裡面都寫有三個必定存在的鍵:

ime file:該輸入法對應的

ime檔案檔名。系統從

system32

目錄(win9x

下為相對於

system目錄)

下讀入該檔案;

layout file:鍵盤布局檔案,一般指向某個系統檔案(自己也沒搞清楚是怎麼回事[-.-]);

layout text:在語言欄設定中選擇要操作的輸入法(啟用

/取消啟用)時看到的輸入法名稱。

另外也有輸入法項裡存在layout display name

和layout id

這些鍵,但沒研究過其意義。

·hkey_current_user\\keyboard layout\\preload

這個位置儲存的是當前使用者啟用的輸入法的列表,也即當前使用者可在語言欄中切換到的輸入法都可以在這裡看到。每個啟用的輸入法佔乙個鍵,其鍵名代表了該輸入法的啟用順序,值內容則為該輸入法安裝後的8

位字串標識。

輸入法程式 ime 的除錯方法

輸入法程式 ime 的除錯方法 以自由拼音 freepy3.1 為例 第一步 安裝freepy3.1 第二步 a 如果是vc6.0 開啟freepy3.1工程,開啟vc主選單的project settings的link屬性頁下的output file name 下 輸入 c winnt system...

win10輸入法設定 win10輸入法切換方法

用慣了win7的孩子突然之間用了win10會有很多的不適應,最顯著的就是我們在使用輸入法的時候,win10的切換方法和win7的切換方法不同,下面小編就為大家分享一下win10怎麼輸入法切換,如果大家用的不習慣可以設定一下快捷鍵,小編也為大家順便說說win10輸入法設定方法 win10輸入法切換方法...

Win8 1輸入法不見了,Win10輸入法不見了

恢復出產設定的oem版win8.1常常因啟用問題沒有微軟輸入法,而win8.1的與x狗等輸入法不相容,遠初將通過本文告訴您如何恢復win8.1和win10的輸入法。進入控制面板,點選所示的紅區。點選選項 輸入法可以直接在這裡選擇設定。因為我是沒啟用的windows系統,所以輸入法缺失,同樣沒啟用輸入...