posted @ 2012-11-13 07:10 from [FreedomShe]
自然語言處理課程有個作業是寫個輸入法,研究良久發現,要寫輸入法只有IME(Input Method Editor)方式靠譜,於是開始研究IME。結果蛋疼的事情發生了,網上關於IME的文章一般多,卻沒有一篇告訴你作為碼農最需要的權威資料——開發文檔——在哪里能夠找到。IME既然是微軟的東西,萬能的MSDN應該會給我詳細的開發文檔,可是我錯了,任憑我花多少時間翻遍MSDN,都沒有古老的win32 IME文檔的影子,哪怕只是ImeProcessKey, ImeToAsciiEx這種基本函數的介紹都沒有。經過N天的等待,終於在此刻找到了我要找的文檔,必須記錄一下,順便把最近看到的優秀資源匯總下。
PS:我使用的是windows98時代的IME——imm32.dll,至今我閱讀的文章中無一不是用這種古老方法搭建輸入法框架。也許現在輸入法編程有了更新更好的方法,但是我不知道(除Win8),如果你知道請留言告訴我!如果你在MSDN上找到了IME的文檔也請留言告訴我!
進入正題,權威文檔如下:
1. Win32 Multilingual IME Overview for IME Development
2. Win32 Multilingual IME Application Programming Interface
這兩篇文檔來自於Windows98 DDK(Device Development Kit),關於IME的這兩篇中IME的部分在Win32 SDK里面沒有,取代DDK的WDK里面也沒有,包括整個MSDN都只能找到IMM的部分。有些古老的東西以前的MSDN上面有,但是現在已經找不到了,MSDN改版后網絡上提供的鏈接已經失效。Windows98 DDK可以從這里下載:http://www.mdgx.com/spx/98DDK.RAR,里面不僅包含上述兩篇IME的開發文檔,而且還有多國的IME輸入法C版本例程,在..\98DDK\CABS\I386\IME_DDK.CAB中可以找到。
IME學習流程
1. 什么是IME?外行解釋:IME就是微軟提供的一個輸入法框架,在這個框架里你只需要編寫一個dll,實現基本的字碼轉換等功能,光標跟隨等其他輸入法通用的雜項都由微軟負責完成。因此你編寫的dll相當於是這個框架內的一個插件,這個插件就是你自己的輸入法。當然,你的輸入法dll必須按照IME的規范來編寫:
1). 輸入法dll必須包含微軟規定的幾個導出函數,大部分是以ime開頭,如ImeInquire, ImeProcessKey, ImeToAsciiEx。
2). 你要實現IME的那些函數,你必須用到IMM的一些函數,這些IMM函數的實現在imm32.dll里面,因此你在寫輸入法的時候必須導入imm.h頭文件和imm32.lib庫來完成編譯。
3). 你的輸入法dll編寫好后,后綴名改為標准的.ime,然后注冊——實質上是把你的dll拷貝到系統目錄,然后向注冊表添加一些信息,你就能在Windows的輸入法屬性里面找到你的輸入法了。
理一理上面的關系:你的dll調用Windows的imm32.dll來獲取用戶的輸入信息,Windows調用你的輸入法dll里面的ime函數將轉換結果告訴用戶。好了,這就是IME框架,你只要做這些,其他的都由Windows操心。
2. 學習IME輸入法編程,收集了一些不錯的資源,那些抄來抄去還不加引用標記的略過了,這些都是我覺得不錯的文章,經過比較原創可能性很大。
Win下的輸入法(IME)編程(1),Win下的輸入法(IME)編程(2):這篇的特點是詳細地解說了自編輸入法的安裝和卸載流程,以“空殼輸入法”為例子手把手地講解。
《淺談輸入法編程》:重要的時刻到了,該文的重點就是例子程序,我的輸入法編寫就是基於該源碼,啟程的作者所寫,文章也寫得很不錯,重點突出,看了很有收獲。啟程輸入之星這是他的另外一個源碼,比前一個內容豐富很多。其實很多輸入法寫手包括本文作者都是參考自由拼音freepy來寫的,但是freepy源碼看過,感覺沒有本文作者的源碼結構清晰。而且我裝的freepy在win7 64位系統下注冊后無法運行,原因不明。
《我的win32 輸入法編程心得》:該文的特點是思維連貫,語言簡潔,很有邏輯的講解了IME編程以及要注意的一些問題,重點突出。
輸入法編程指南+IME輸入法編程四章.chm:參考文檔,比較全面(不過實際上也是照開發文檔翻譯的),后面那四章被人們copy來copy去不加引用,於是作者不詳了。
《輸入法編程漫談》:(原文出自北大中文論壇,但排版太亂又禁外部IP,貼了另外一處的鏈接)該文告訴你:輸入法編程一點都不難,外行看看漲信心!
看完上面中的某幾篇,你應該能熟悉IME的編程框架並能上手寫代碼了,無非就是那些ime, imm開頭的函數而已(當然還有幾個其他函數)。但要想成為IME輸入法框架編寫高手,還是看看原始的開發文檔吧。這里有兩篇不全的翻譯:Windows 95 輸入法編輯器,翻譯:windows2000 DDK中IME輸入法編程的資料(前10頁)。
IME純C版本,那些復雜的結構體大致搞清楚他們之間的關系不算太困難,但是要想搞懂每個結構體里面的變量定義,以及如何使用它們,恐怕不是那么簡單,特別是在網上相關資料匱乏的情況下。其實要生成輸入法,如果不是專業的輸入法制作團隊,完全沒必要去研究這該死的98C版IME,用個輸入法生成器舒服得跳過IME的編寫過程。推薦:多多輸入法生成器,功能齊全!