IME程式設計心得

2021-04-13 05:00:20 字數 4468 閱讀 9565

二、imm-ime結構的基本工作過程及特點

使用者鍵盤訊息->系統通過imm傳遞給與當前執行緒對應的ime->ime根據輸入的訊息和輸入上下文中記錄的資料,將使用者的鍵盤動作轉換成結果串->以字串訊息的形式返回給imm->放到應用程式視窗的訊息佇列中。

三、ime的構成

1.ime轉換介面(ime conversion inte***ce)

2.ime使用者介面(ime user inte***ce)

由使用者實現的一組視窗,這些視窗用來接收和處理由imm發來的輸入訊息,提供與使用者互動的介面.由下面的視窗組成:

1)預設的ime視窗(default ime window)

2)使用者介面視窗(ui inte***ce)

3)使用者介面視窗的元件:狀態視窗(status window);編碼視窗(compsition window);候選視窗(candidate window).

4)軟鍵盤和系統選單/圖示等

四、ime的實現

1.ime轉換介面的實現

這些介面函式在供管理器在適當的時候呼叫.這些函式並非每個都要進行自己的處理,大部分保留乙個空函式即可,但沒有卻不可.系統預設是要呼叫的,找不到就不行.有以下函式:

1)imeinquire

2)imeconfigure

3)imeprocesskey

4)imetoasciiex

5)imeselect

6)imesetactivecontext

7)notifyime

8)imedestroy

9)imeconversionlist

10)imeescape

11)imesetcompsitionstring

12)imeregisterword

13)imeunregisterword

14)imegetregisterwordstyle

15)imeenumregisterword

2.ime使用者介面的實現

主要包括使用者介面視窗(視窗類和視窗過程),使用者介面視窗的元件(狀態視窗,編碼視窗和候選視窗的視窗類和視窗過程),輸入法的配置視窗,軟鍵盤,任務條上的指示器視窗(圖示,選單,工具提示)和輸入法熱鍵等.

1)使用者介面視窗:程式設計中主要是處理由預設的ime視窗傳入的ime訊息,當然,並非所有的ime訊息都需要給出具體處理(可以看出這是ime程式設計中的乙個原則).如:

wm_ime_composition

wm_ime_startcompsition/wm_ime_endcomposition

wm_ime_select

wm_ime_notify

wm_ime_char

五、具體實現步驟:

ime實質上是乙個dll實現,由系統呼叫。而這個dll則分別實現了系統要呼叫的功能函式。所以有些函式雖然不

做什麼事情,但是必需掛上乙個空殼。否則呼叫出錯。

1.dllmain()的架構

1)進入程序

dll_process_attach事件中,註冊使用者介面視窗類及其元件的視窗類:使用registerclas***()完成此註冊過程

。設定類名字段(lpszclassname)為使用者介面視窗類類名(包括結束標誌'/0'在內最長可達16字元),在類風格

(style)欄位中必須包括cs_ime風格。設定附加記憶體大小(cbwndextra)。

2)退出程序

登出上述與輸入法編輯器有關的視窗類,進行全域性性的清理工作。

2.開啟/關閉輸入法編輯器時進行的初始化操作

1)使用者介面視窗是由預設的ime視窗在接到wm_ime_select訊息時建立的。輸入法管理器通過呼叫imerequire接

,建立輸入法編輯器的使用者介面視窗。所以imerequire是輸入法轉換介面必須實現的第乙個函式。

2)在使用者介面視窗被建立後,可以進行輸入法編輯器全域性性的一些初始化工作,比如申請自己的私有記憶體,建

立私有上下文等,這些工作一般在處理wm_ime_select訊息或在介面函式imeselect中進行,也可以在視窗過程

處理wm_create訊息時進行。

3.進入程序後:

1)初始化詞庫

2)建立字型

3)註冊視窗類

4.在ui視窗建立後,建立寫作視窗和候選視窗

各個視窗下進行各自的訊息函式處理

在這裡有疑問:ui視窗是什麼?ui視窗處理了ime的好多訊息.--解答參看《基於imm-ime輸入法介面的實現方法》

下乙個任務:看這個**

ui視窗是對使用者不可見的,但是它是所有使用者介面視窗的元件視窗的父視窗,是全部元件視窗的管理者.

5.構建框架的問題

在projects-settings-c/c++-catagory:prepossessor:additional include directories: 加上"./"

避免新增系統預設的標頭檔案

6.注意的細節問題:

1)global.c中的#pragma data_seg(".zhenhuadic"),應詳細了解其作用,其與czh.def中的定義有相關聯的地方.(對我們的工程名czh來說)

2)freepy.exp : warning lnk4070: /out:czh.ime directive in .exp differs from output filename

;c:/windows/system32/freepy.ime; ignoring directive

對於這個build中的錯誤,關聯之處在於czh.def中定義了lib的輸出名為czh,要求這個lib的輸出名與output file name freepy相同.

3)如果.ime名和上述2)中說的問題沒有的話,且freepy.h(原工程)中的#define freepyfilename   _t("freepy.ime")定義正確,則在hzfreepy.h中改變以下幾個檔名與c:/windows/system32/(window xp系統下)下的相關檔名相同則可:

freepy.tab--字型檔

freepysys.dic--系統詞庫

freepyusr.dic--使用者詞庫

4)在imeselect的函式中,有個登錄檔鍵值的處理與工程有關聯

5)有四條訊息的遺漏:

imm:notifyime

imm:notifyime:ni_contextupdated

imm:notifyime:ni_contextupdated:imc_setcompositionwindow

uiwnd

uiwnd:wm_ime_notify

uiwnd:wm_ime_notify:imn_setcompositionwindow

uiwnd:3

uiwnd

uiwnd:wm_ime_notify

uiwnd:wm_ime_notify:imn_setopenstatus

uiwnd:3

uiwnd

uiwnd:wm_ime_notify

uiwnd:wm_ime_notify:imn_setconversionmode

uiwnd:3

uiwnd

uiwnd:wm_ime_notify

uiwnd:wm_ime_notify:imn_setsentencemode

在開發過程中,初始化的四條訊息缺漏.考察:與**有關還是與安裝有關?

自己開發安裝是手動完成的,即通過直接改登錄檔來實現的.為了檢測,我將自己的開發**工程作如下變動:

----settings-output file name/freepy.ime

----字型檔詞庫名不變,但存在system32目錄下

只要這樣,就可以出現了上述的訊息.這時還與imeselect下的登錄檔項讀取無關、與czh.h中的檔名定義無關、與czh.def中的lib定義無關。但是在除錯時,選擇輸入法時卻可將本工程的圖示之類的調出來。這樣看來,只是無法輸入文字(還沒實現相關的功能),目前的結論是:四個訊息的遺漏與安裝有關。

7)製作安裝程式:仿照freepy的安裝程式,製作乙個自己的安裝程式,然後重新安裝,安裝之後要進行更新,也就是到輸入法的新增刪除介面進行刪除然後再新增進來,登出系統之後,就可以用了.

這樣安裝的結果是:多出了上面的第二條訊息,其它仍然不行.--哪究竟與誰有關係?是不是與**有關?

只要將,settings中的作改變就可以實現訊息補充.這與什麼有關係?

8)再重新安裝一次,這次重灌是這樣的:

--hkey_local_machine/system/currentcontrolset/control/keyboard layouts/下對應的振華輸入法子項都刪除

--hkey_current_user/keyboard layout/preload 下對應的本輸入法的子項刪除

--hkey_local_machine/software/下的czhhua刪除.

這樣重灌之後,訊息出現.

7.流程分析:

1)字型檔的裝載

這個工作是在程式進入dll的開始部分就執行的,將字典內容儲存到儲存區,以備將compstr轉成漢字時呼叫儲存區. 

初探WINDOWS下IME程式設計

大家知道,delphi許多控制項有ime屬性。這麼好用的東西vc可沒自帶,怎麼辦呢?其實,可通過登錄檔,用api實現。1 將用到的api regopenkey 開啟登錄檔一鍵 regqueryvalue 查詢一鍵值 regqueryvalueex 同上 regclosekey 關閉開啟的鍵 load...

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

win 下的輸入法程式設計方法 在win 下編寫輸入法主要可以採用外掛程式式和 ime方式兩種 外掛程式式的實現核心是通過鍵盤鉤子對輸入進行攔截,再把要輸出的內容傳送給處於活動狀態的編輯視窗。ime 方式則是使用系統提供的 ime input method editor 介面實現輸入法。頭一種方法自...

input輸入IME問題

ime問題,即中文輸入時出現在輸入框上方的帶候選但還未選擇的狀態,input框中會輸入出現連續的字母異常問題 onchange或者oninput事件不可用,onblur事件產品體驗效果不佳 oncompositionstart 開始打字 oncompositionend 打字結束 oncomposi...