二、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...