ImeLib v0.1 測試報告,以及與 IMM32.dll 比較

這裡記錄一下自己測試 ImeLib v0.1 的結果,並簡單比較 IFELanguage 與 IMM32.dll。

測試結果

在一台全新安裝的 Windows XP SP 3 環境上,微軟新注音輸入法的版本 2002, ImeLib 的範例程式可正確執行,安裝了 Office 2007 之後,微軟新注音輸入法升級成 2007 版,發現還是可以取得中文字的注音字根,故應可先下這個結論:

即使微軟新注音 2007 把查詢注音字根的功能拿掉了,程式還是可以透過 IFELanguage 取得注音字根。

在全新安裝的環境下,使用 ImeLib 附的範例程式測試「便宜又方便得不得了」,取得之注音字根為:

ㄆㄧㄢˊ ㄧˊ ㄧㄡˋ ㄈㄤ ㄅㄧㄢˋ ㄉㄟˇ ㄅㄨˋ ㄉㄜˊ ㄌㄧㄠˇ

注意第一個「得」的讀音是ㄉㄟˇ。此外,即使沒有安裝簡體中文拼音輸入法,還是可以取得拼音,這跟我之前在開發環境上測試的結果又不一樣。

在另一台平常使用的機器上測試的結果是:

ㄆㄧㄢˊ ㄧˊ ㄧㄡˋ ㄈㄤ ㄅㄧㄢˋ ㄉㄜ˙ ㄅㄨˋ ㄉㄜˊ ㄌㄧㄠˇ

如果在這台平常使用的機器上,把微軟新注音的「啟用個人化調整」、「啟用常用新詞學習」、和「啟用使用者造詞詞典」這三項功能關閉,則結果跟全新安裝的環境所測試的結果相同。也就是說,使用 ImeLib(IFELanguage)取得之注音字根,會依下列環境差異而有不同的結果:
  1. 電腦上安裝的微軟新注音版本
  2. 微軟新注音的辭典學習設定
  3. 使用者經常輸入的詞彙與讀音(如果有開啟辭典學習功能的話)
如果將微軟新注音 2007 和微軟傳統注音輸入法從控制台的「地區及語言」設定中移除,還是可以透過 IFELanguage 順利取得注音字根,而且和前面的測試結果相同;這是因為安裝輸入法時註冊的 DLL/IME 檔案並未移除的緣故。

另外,在 Windows Server 2008 英文版環境下的測試結果,雖然有安裝英文版的 Office 2007 和微軟新注音,可是 ImeLib 的範例程式只對日文有效,取得注音和拼音時都會出錯,即使安裝繁體中文的 language pack 也一樣。用 RegEdit 工具搜尋已註冊的輸入法 COM 元件,只找到 MSIME.Japan,沒有 MSIME.China 和 MSIME.Taiwan,可見這兩種語言服務只有在中文版的 Windows 和 Office 2007 才有。在安裝了 Office 2007 中文版之後,ImeLib 的範例程式便可順利取得注音字根。

順便整理一下微軟新注音輸入法各種版本的 COM 元件註冊資訊:
  • 微軟新注音輸入法 2002a
    ProgID: MSIME.Taiwan.1
    InProcServer32: C:\WINDOWS\system32\TINTLGNT.IME
  • 微軟 Office XP 輸入法(新注音 2003)
    ProgID: MSIME.Taiwan.2 和 MSIME.Taiwan.ImeBbo.1
    InProcServer32: C:\WINDOWS\system32\MSTCIPHA.IME
  • 微軟新注音 2007
    ProgID: MSIME.Taiwan.12
    InProcServer32: C:\Program Files\Common Files\Microsoft Shared\IME12\IMETC\IMTCCORE.DLL
如果 Windows registry 裡面完全找不到上述 MSIME.Taiwan 的 COM 元件註冊資訊,ImeLib(IFELanguage)就無法取得注音字根。

與 IMM32.dll 比較

在撰寫 ImeLib 之前,我曾到 MSDN forum 提出 IMM32.dll versus IFELanguage 的問題,但沒人理我。也許是因為貼在英文論壇的緣故,或者亞洲語言的輸入法問題太冷門了吧。

前面提到,即使將微軟新注音從控制台的「地區及語言」移除,IFELanguage 還是可以 work;但如果程式是使用 IMM32.DLL 來取得注音字根,就不能將注音輸入法移除,因為這種比較早期的 API 需要先取得輸入法的 KeyboardLayout handle,才能對該輸入法查詢注音字根。此外,黃忠成先生的<Vista 與輸入法程式介面>文章裡面也有提到 IMM32.DLL 在 Vista 作業系統中有相容性的問題,並說明如何以新的 TSF(Text Service Framework)解決,頗值得參考。

就我之前使用 IMM32.dll 的經驗,發現它至少還有兩個限制。首先,應用程式必須是屬於 desktop 類型(例如 Windows Forms、Console 應用程式)或能夠與桌面互動的 Windows services。因此,如果在 ASP.NET 應用程式中直接呼叫 IMM32.dll,是無法順利取得組字字根的。IMM32.dll 的另一個限制,是在呼叫 ImmGetConversionList 以取得整句中文(而非單一中文字)的注音字根時,只有「微軟新注音 2003」的版本才能得到正確結果;我在「微軟新注音 2002a」和「微軟新注音 2007」上面測試的結果是得到空字串(這說不定是我自己寫的程式有 bug,或者不同作業環境的問題,不知是否有人試出不同結果?)。

從以上幾點來看,新開發的應用程式最好還是採用比較新的解決方案,盡量避免使用早期的 IMM32.DLL。

我會陸續在 ImeLib 中增加與輸入法有關的功能,例如:取得目前系統已安裝的輸入法、判斷某個輸入法是否有安裝、切換特定視窗或輸入控制項的輸入法等等,也歡迎對這方面有興趣的人協助測試 ImeLib 並提供改進建議。

ImeLib 專案首頁:http://imelib.codeplex.com/

Post Comments

技術提供:Blogger.