Windows CE下中文輸入法編輯器

CE包含了一種簡體中文輸入法編輯器,如果不想編寫自己的輸入法編輯器,那麼可以直接調用默認的。在講解中文輸入法編輯器之前順便提一下國際化(Internationalization),中文輸入法及輸入法編輯器只是國際化組件的一小部分。國際化是編寫面向不同語言用戶的軟件過程中一個重要環節,CE的國際化組件包含很多小的組件 。

  下表描述了組件的名稱、功能: 名稱功能Agfa字體壓縮支持字體壓縮字體版本因爲東亞字體佔據內存較大,此組件提供了用於選擇不同大小字體文件的選項手寫識別手寫識別引擎多語言用戶界面提供給最終用戶用於切換語言種類National Language System國家語言支持(包括日期、時間、數字、貨幣格式)Transcriber應用程序識別英語、法語、德語的手寫識別程序Unicode碼支持能夠處理和顯示Unicode碼日語IME日語輸入法編輯器韓語IME韓語輸入法編輯器簡體中文IME簡體中文輸入法編輯器Shuang Pin IM簡體中文雙拼輸入法GB18030 轉換器在GB18030到CE編碼之間的轉換繁體中文IME繁體中文輸入法編輯器

  在定製內核的時候常會遇到這些組件,尤其是字體版本,選擇不同的字體對於整個內核的大小影響很大。在定製內核的時候,選擇PB提供的字體版本應該參照標題爲"Font Versions"的幫助文檔,在這個文檔中詳細的列舉了東亞語言字體的文件名稱、內容、正常大小和壓縮大小。除了選擇合適的字體版本外,還應該採用Agfa字體壓縮技術,Agfa字體壓縮技術的優點是能夠減小字體佔用的ROM和RAM空間,另外能夠保證在壓縮和解壓縮後數據不丟失。如果採用字體壓縮,Agfa壓縮技術將字體壓縮成TrueType格式,並另存爲擴展名爲".ac3"的文件,那麼CE在使用字體的時候首先尋找擴展名爲".ac3"的文件。如果不採用字體壓縮,CE將使用非壓縮字體,如擴展名爲".ttf"".ttc"的文件。下面講述關於簡體中文輸入法編輯器的相關知識。

  CE的輸入法系統由下列幾個部分組成:

  IME(輸入法編輯器)內核。包括和用戶輸入的語言相關的內容,比如輸入法、文字庫等

  IME界面。包括狀態窗口、寫作窗口、候選窗口、指南窗口

  IMM(輸入法管理器)。負責在CE系統、應用程序、IME之間通信

  輸入上下文。包括用戶輸入狀態等

  IME控制窗口。負責發送未處理的IME消息到IME

  輸入法系統的工作機制如下:

  當輸入法系統啓動後,用戶按鍵盤,鍵盤消息被IMM發送到IME。IME處理消息內容,根據鍵盤消息的內容或者產生用於寫作的字符,或者產生命令。當IME處理鍵盤消息後,它發送通知消息到當前獲得焦點的窗口,如果這個窗口不能處理IME通知消息,那麼通知消息被髮送到IME控制窗口,控制窗口將消息返回到IME,IME做默認的處理工作(IME提供了完整的用戶接口)。對於能夠處理IME通知消息的窗口,被稱之爲IME-aware窗口,相反不能處理IME通知消息的窗口,被成爲IME-unaware窗口。能夠處理IME通知消息的窗口通過IMM 函數能夠實現自定義的輸入法編輯器。

  輸入上下文:

  輸入上下文存儲了IME的狀態信息,它是IME的內部結構。對於每一個線程,系統創建和分配了一個默認的輸入上下文,在線程內的每個窗口都共享輸入上下文的內容。具體輸入上下文的結構體定義包含在標題爲"INPUTCONTEXT"的幫助文檔中。從文檔中看出,輸入上下文包含對應窗口句柄、寫作窗口和候選窗口和狀態窗口的位置、字體、消息緩衝區等等。用函數ImmGetContext可以得到指定窗口對應的輸入上下文的句柄。用ImmReleaseContext釋放指定的輸入上下文。如果不希望一個線程內的窗口都共享同一個輸入上下文,那麼可以調用函數ImmCreateContext來創建一個新的上下文,並調用函數ImmAssociateContext將新創建的輸入上下文與指定的窗口關聯。當不用這個新創建的上下文時,調用ImmDestroyContext來釋放內存。調用函數ImmLockIMC能夠得到一個指定的輸入上下文的指針,通過這個指針可以訪問輸入上下文的數據。訪問結束後調用函數ImmUnlockIMC,ImmUnlockIMC減少計算鎖數量,直到釋放句柄。關於輸入上下文的例子代碼如下:

HIMC hIMC = ImmCreateContext();  ///創建新的上下文
LPINPUTCONTEXT lpIC;
lpIC = ImmLockIMC(hIMC);
....................       ///使用lpIC訪問上下文
數據
ImmUnlockIMC(lpIC);
ImmAssociateContext(hWnd, hIMC);  ///與窗口關聯
ImmDestroyContext(hIMC);     ///最後釋放上下文
下面是調用中文輸入法的例子代碼:HIMC hIMC = ImmGetContext(hWnd);  ///hWnd爲當前窗口句柄
POINT pt;
pt.x = 300;
pt.y = 200;
ImmSetStatusWindowPos(hIMC, &pt);   ///設置狀態窗口位置
ImmSetOpenStatus(hIMC, TRUE);    ///打開中文輸入法
ImmReleaseContext(hEdit, hIMC);     ///最後釋放上下文
  我在開發過程中發現並非所有Imm函數都有效,通過對Pocket IME源碼分析後證實了我的發現。但上述的函數都能夠實現功能,對於只要能夠打開並使用中文輸入法的要求還是可以滿足的。

////////////////////////////////////////////////////////////////////////////////////

Dim hkb As Long

hkb = GetKeyboardLayout(0) '取得目前Thread的Keyboard Layout

 

 

If ImmIsIME(hkb) = 0 Then '代表不是中文輸入

ImmSimulateHotKey hwnd, IME_THOTKEY_IME_NONIME_TOGGLE '模擬按Strl-Space

 

 

End If

Dim hkb As Long

hkb = GetKeyboardLayout(0) '取得目前Thread的Keyboard Layout

 

 

If ImmIsIME(hkb) = 1 Then '代表是中文輸入

ImmSimulateHotKey hwnd, IME_THOTKEY_IME_NONIME_TOGGLE '模擬按Strl-Space

 

 

End If

 

IME消息、函數、命令、需要的數據結構、常量

原文地址:http://kisin.blogbus.com/logs/34741858.html

IME消息
  以下列出IME中用到的消息。
WM_IME_CHAR(IME得到了轉換結果中的一個字符)
WM_IME_COMPOSITION(IME根據用戶擊鍵的情況更改了按鍵組合狀態)
WM_IME_COMPOSITIONFULL(IME檢測到按鍵組合窗口的區域無法繼續擴展)
WM_IME_CONTROL(由應用程序直接向IME發出控制請求)
WM_IME_ENDCOMPOSITION(IME完成了對用戶擊鍵情況的組合)
WM_IME_KEYDOWN(檢測到“鍵盤上的某鍵被按下”的動作,同時在消息隊列中保留該消息)
WM_IME_KEYUP(檢測到“鍵盤上的某鍵已彈起”的動作,同時在消息隊列中保留該消息)
WM_IME_NOTIFY(IME窗口發生了改變)
WM_IME_REQUEST(通知:IME需要應用程序提供命令和請求信息)
WM_IME_SELECT(操作系統將改變當前IME)
WM_IME_SETCONTEXT(輸入焦點轉移到了某個窗口上)
WM_IME_STARTCOMPOSITION(IME準備生成轉換結果)

IME函數
  本節列出了所有IME函數。
函數
說明
EnumInputContext
由應用程序定義的,提供給ImmEnumInputContext函數用來處理輸入環境的一個回調函數。
EnumRegisterWordProc
由應用程序定義的,結合ImmEnumRegisterWord函數一起使用的一個回調函數。
ImmAssociateContext
建立指定輸入環境與窗口之間的關聯。
ImmAssociateContextEx
更改指定輸入環境與窗口(或其子窗口)之間的關聯。
ImmConfigureIME
顯示指定的輸入現場標識符的配置對話框。
ImmCreateContext
創建一個新的輸入環境,併爲它分配內存和初始化它。
ImmDestroyContext
銷燬輸入環境並釋放和它關聯的內存。
ImmDisableIME
關閉一個線程或一個進程中所有線程的IME功能。
ImmDisableTextFrameService
關閉指定線程的文本服務框架(TSF)功能--雖然這裏把它列了出來,但建議程序員最好不要使用這個函數。
ImmEnumInputContext
獲取指定線程的輸入環境。
ImmEnumRegisterWord
列舉跟指定讀入串、樣式和註冊串相匹配的註冊串。
ImmEscape
對那些不能通過IME API函數來訪問的特殊輸入法程序提供兼容性支持的一個函數。
ImmGetCandidateList
獲取一個候選列表。
ImmGetCandidateListCount
獲取候選列表的大小。
ImmGetCandidateWindow
獲取有關候選列表窗口的信息。
ImmGetCompositionFont
獲取有關當前用來顯示按鍵組合窗口中的字符的邏輯字體的信息。
ImmGetCompositionString
獲取有關組合字符串的信息。
ImmGetCompositionWindow
獲取有關按鍵組合窗口的信息。
ImmGetContext
獲取與指定窗口相關聯的輸入環境。
ImmGetConversionList
在不生成任何跟IME有關的消息的情況下,獲取輸入按鍵字符組合或輸出文字的轉換結果列表。
ImmGetConversionStatus
獲取當前轉換狀態。
ImmGetDefaultIMEWnd
獲取缺省IME類窗口的句柄。
ImmGetDescription
複製IME的說明信息到指定的緩衝區中。
ImmGetGuideLine
獲取出錯信息。
ImmGetIMEFileName
獲取跟指定輸入現場相關聯的IME文件名。
ImmGetImeMenuItems
獲取註冊在指定輸入環境的IME菜單上的菜單項。
ImmGetOpenStatus
檢測IME是否打開。
ImmGetProperty
獲取跟指定輸入現場相關聯的IME的屬性和功能。
ImmGetRegisterWordStyle
獲取跟指定輸入現場相關聯的IME所支持的樣式列表。
ImmGetStatusWindowPos
獲取狀態窗口的位置。
ImmGetVirtualKey
獲取跟IME處理的鍵盤輸入消息相關聯的初始虛擬鍵值。
ImmInstallIME
安裝一個IME。
ImmIsIME
檢測指定的輸入現場是否有和它相關的IME。
ImmIsUIMessage
檢查IME窗口消息併發送那些消息到特定的窗口。
ImmNotifyIME
通知IME有關輸入環境狀態已改變的消息。
ImmRegisterWord
註冊一個輸出文字到跟指定輸入現場相關聯的IME的字典中去。
ImmReleaseContext
銷燬輸入環境並解除對跟它相關聯的內存的鎖定。
ImmSetCandidateWindow
設置有關候選列表窗口的信息。
ImmSetCompositionFont
設置用來顯示按鍵組合窗口中的字符的邏輯字體。
ImmSetCompositionString
設置按鍵組合字符串的字符內容、屬性和子串信息。
ImmSetCompositionWindow
設置按鍵組合窗口的位置。
ImmSetConversionStatus
設置當前轉換狀態。
ImmSetOpenStatus
打開或關閉IME功能。
ImmSetStatusWindowPos
設置狀態窗口的位置。
ImmSimulateHotKey
在指定的窗口中模擬一個特定的IME熱鍵動作,以觸發該窗口相應的響應動作。
ImmUnregisterWord
從跟指定輸入環境相關聯的IME的字典中註銷一個輸出文字。

IME命令
  以下列出IME中用到的命令(控制消息)。

IMC_CLOSESTATUSWINDOW(隱藏狀態窗口)
IMC_GETCANDIDATEPOS(獲取候選窗口的位置)
IMC_GETCOMPOSITIONFONT(獲取用來顯示按鍵組合窗口中的文本的邏輯字體)
IMC_GETCOMPOSITIONWINDOW(獲取按鍵組合窗口的位置)
IMC_GETSTATUSWINDOWPOS(獲取狀態窗口的位置)
IMC_OPENSTATUSWINDOW(顯示狀態窗口)
IMC_SETCANDIDATEPOS(設置候選窗口的位置)
IMC_SETCOMPOSITIONFONT(設置用來顯示按鍵組合窗口中的文本的邏輯字體)
IMC_SETCOMPOSITIONWINDOW(設置按鍵組合窗口的樣式)
IMC_SETSTATUSWINDOWPOS(設置狀態窗口的位置)
IMN_CHANGECANDIDATE(IME通知應用程序:候選窗口中的內容將改變)
IMN_CLOSECANDIDATE(IME通知應用程序:候選窗口將關閉)
IMN_CLOSESTATUSWINDOW(IME通知應用程序:狀態窗口將關閉)
IMN_GUIDELINE(IME通知應用程序:將顯示一條出錯或其他信息)
IMN_OPENCANDIDATE(IME通知應用程序:將打開候選窗口)
IMN_OPENSTATUSWINDOW(IME通知應用程序:將創建狀態窗口)
IMN_SETCANDIDATEPOS(IME通知應用程序:已結束候選處理同時將移動候選窗口)
IMN_SETCOMPOSITIONFONT(IME通知應用程序:輸入內容的字體已更改)
IMN_SETCOMPOSITIONWINDOW(IME通知應用程序:按鍵組合窗口的樣式或位置已更改)
IMN_SETCONVERSIONMODE(IME通知應用程序:輸入內容的轉換模式已更改)
IMN_SETOPENSTATUS(IME通知應用程序:輸入內容的狀態已更改)
IMN_SETSENTENCEMODE(IME通知應用程序:輸入內容的語句模式已更改)
IMN_SETSTATUSWINDOWPOS(IME通知應用程序:輸入內容中的狀態窗口的位置已更改)
IMR_CANDIDATEWINDOW(通知:選定的IME需要應用程序提供有關候選窗口的信息)
IMR_COMPOSITIONFONT(通知:選定的IME需要應用程序提供有關用在按鍵組合窗口中的字體的信息)
IMR_COMPOSITIONWINDOW(通知:選定的IME需要應用程序提供有關按鍵組合窗口的信息)
IMR_CONFIRMRECONVERTSTRING(通知:IME需要應用程序更改RECONVERTSTRING結構)
IMR_DOCUMENTFEED(通知:選定的IME需要從應用程序那裏取得已轉換的字符串)
IMR_QUERYCHARPOSITION(通知:選定的IME需要應用程序提供有關組合字符串中某個字符的位置信息)
IMR_RECONVERTSTRING(通知:選定的IME需要應用程序提供一個用於自動更正的字符串)

IME編程中需要用到的數據結構
  這裏列了所有在使用輸入法編輯器函數和消息時需要用到的數據結構。
  CANDIDATEFORM(描述候選窗口的位置信息)
  CANDIDATELIST(描述有關候選列表的信息)
  COMPOSITIONFORM(描述按鍵組合窗口的樣式和位置信息)
  IMECHARPOSITION(描述按鍵組合窗口中的字符的位置信息)
  IMEMENUITEMINFO(描述IME菜單項的信息)
  RECONVERTSTRING(定義用於IME自動更正功能的字符串)
  REGISTERWORD(描述一個要註冊的讀入信息或文字內容)
  STYLEBUF(描述樣式的標識符和名稱)

IME常量
  這裏列出了所有在使用輸入法編輯器函數和消息時需要用到的常量。
  • IME轉換模式常量
  • IME按鍵組合字符串常量
  • IME熱鍵標識常量
  • IME句型模式常量
  • IMMEscape函數常量

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