IME 接口函數

ImeConversionList:根據輸入上下文的有關內容,將一個字符或者字符串轉換成遠東字符結果列表或者另外一個字符串。
此函數的做用是在輸入串和結果串之間進行變換以便於進行從新轉換,因此在此函數中不該該產生任何相關的輸入法編輯器消息;程序員

 


BOOL WINAPI ImeConfigure(HKL hKL,HWND hWnd, DWORD dwMode, LPVOID lpData)
這是最後一個須要注意的接口,在顯示輸入法屬性配置時會Windows會調用這個接口.
#ImeConfigure:此接口函數將在用戶經過控制面板或系統圖標設置輸入法屬性時被輸入法管理器調用。在此函數中能夠顯示屬性設置對話框,供用戶配置輸入法的可選項;編輯器

 


ImeDestroy:結束輸入法編輯器的工做;函數

 


ImeEscape:應用程序經過調用這個函數能夠直接訪問某個輸入法編輯器的特定功能,這些功能一般沒法經過其餘的IMM函數調用實現。這麼作的目的主要是爲了支持特定語種的函數或者IME的私有函數;ui

 


/**********************************************************************/
/* ImeInquire() */
/**********************************************************************/
BOOL WINAPI ImeInquire(LPIMEINFO lpImeInfo, LPTSTR lpszWndCls, DWORD dwSystemInfoFlags)
這個函數是除了DllMain後第一個會被win32 IMM調用的函數.
IMM經過調用這個函數知道你的輸入法有什麼特性. 好比,除了按鍵消息外,你是否是還想處理鍵放開的消息.
#ImeInquire:此接口函數在用戶選擇某個輸入法時最早由輸入法管理器調用,以得到該輸入法的有關信息。函數應返回輸入法編輯器的初始化信息,在IMEINFO結構中設置當前輸入法的各項屬性,以及當前輸入法的用戶界面窗口類名稱;
 編碼

 
 
/***********************************************************************/
/*系統調用這個接口來判斷IME是否處理當前鍵盤輸入 */
/*HIMC hIMC:輸入上下文 */
/*UINT uKey:鍵值 */
/*LPARAM lKeyData: unknown */
/*CONST LPBYTE lpbKeyState:鍵盤狀態,包含256鍵的狀態 */
/*return : TRUE-IME處理,FALSE-系統處理 */
/*系統則調用ImeToAsciiEx,不然直接將鍵盤消息發到應用程序 */
/**********************************************************************/
BOOL WINAPI ImeProcessKey(HIMC hIMC,UINT uKey,LPARAM lKeyData,CONST LPBYTE lpbKeyState)
觀察註釋,您能夠看到在個接口是用來判斷用戶敲擊的哪一個鍵須要處理,哪一個鍵又應該交給系統本身處理.
若是輸入法須要本身處理用戶輸入的鍵,則在這個接口中返回true,不然返回false.
#ImeProcessKey:此接口函數由輸入法管理器在處理鍵盤事件時調用。在此函數中對鍵盤事件進行預處理,根據此函數的返回值,系統肯定對於特定的輸入上下文來講此鍵盤事件是否應送交輸入法編輯器進行處理。若是返回TRUE,
則表示應該先把鍵盤消息傳送到輸入法編輯器進行處理,因此輸入法管理器會緊接着繼續調用ImeToAsciiEx函數;
若是返回FALSE,說明此消息不須要輸入法編輯器進行處理,輸入法管理器將其直接送到應用程序接口

 

 
/**********************************************************************/
/* ImeSelect() */
/* Return Value: */
/* TRUE - successful, FALSE - failure */
/**********************************************************************/
BOOL WINAPI ImeSelect(HIMC hIMC,BOOL fSelect)
在這個接口中,系統通知輸入法當前是否打開了輸入法輸入.
通常輸入法啓動時會調用一次,在一些軟件(如EmEditor)中提供打開與關閉輸入法的功能就是經過這個接口實現的.
若是打開輸入法,通常會在這個接口中作一些數據的初始化工做.
#ImeSelect:此接口函數在用戶打開或關閉輸入法時被調用。在此函數中對輸入法上下文內容進行初始化或恢復釋放。在實現某個輸入法編輯器的時候,可能須要對輸入法上下文中包含的內容項進行擴充,擴充後的輸入法上下文稱爲此輸入法的私有上下文。在打開輸入法時,函數的fSelect參數爲TRUE,須要完成對標準的輸入法上下文的擴充工做,申請追加內存,預設各個內容項的初值;在關閉輸入法時,fSelect參數爲FALSE,須要釋放爲私有上下文申請的附加資源;事件

 


ImeSetActiveContext:若是在某個窗口中打開了輸入法編輯器,那麼此接口函數會在應用程序窗口得到或失去輸入焦點時被調用。在此函數中能夠獲取當前的輸入法上下文並通知輸入法編輯器用戶界面窗口組件,令其刷新顯示;內存

 


ImeSetCompositionString:根據參數中給出的數據,修改寫做字符串。這個函數將向輸入法編輯器發送一條WM_IME_COMPOSITION.ci

 


/****************************************************************************************************************/
/* function:應用程序調用這個接口來進行輸入上下文的轉換,輸入法程序在這個接口中轉換用戶的輸入 */
/* UINT uVKey:鍵值,若是在ImeInquire接口中爲fdwProperty設置了屬性IME_PROP_KBD_CHAR_FIRST,則高字節是輸入鍵值*/
/* UINT uScanCode:按鍵的掃描碼,有時兩個鍵有一樣的鍵值,這時須要使用uScanCode來區分 */
/* CONST LPBYTE lpbKeyState:鍵盤狀態,包含256鍵的狀態 */
/* LPDWORD lpdwTransKey:消息緩衝區,用來保存IME要發給應用程序的消息,第一個雙字是緩衝區能夠容納的最大消息條數 */
/* UINT fuState:Active menu flag(come from msdn) */
/* HIMC hIMC:輸入上下文 */
/* return : 返回保存在消息緩衝區lpdwTransKey中的消息個數 */
/****************************************************************************************************************/
UINT WINAPI ImeToAsciiEx (UINT uVKey,UINT uScanCode,CONST LPBYTE lpbKeyState,LPDWORD lpdwTransKey,UINT fuState,HIMC hIMC)
這個接口能夠說是輸入法最重要的部分,程序員須要在這個接口中實現編碼與重碼的轉換,轉換完成或者顯示在編碼窗口及重碼窗口,或者發送到應用程序.
因爲在這個接口中沒有傳入窗口句柄,如何通知輸入法程序的窗口更新顯示呢?固然咱們可使用全局變量,在此我我的推薦的方法是使用IME消息(沒有什麼道理),您將消息類型參數保存到lpdwTransKey指示的緩衝區中,User.exe會根據消息類型作相應的處理並傳遞到UIWnd這個窗口中.
那麼如何輸入文字呢?要輸入文字須要3個消息配合使用,分別是WM_IME_STARTCOMPOSITIONWM_IME_COMPOSITION和WM_IME_ENDCOMPOSITION,它們分別指示開始輸入編碼,輸入編碼或者結果(視參數而異)及編碼輸入完成.
在開始編寫輸入法的時候,爲了省事,個人輸入法在用戶肯定要輸入一個重碼時才連續調用這3個消息以向編碼器中輸入文字.因爲WM_IME_STARTCOMPOSITION和WM_IME_ENDCOMPOSITION須要成對使用,這種方法能夠確保它們配對.
最初這種方式工做得很好,可是後來發如今一些軟件中出現兼容性問題如智能五筆在遨遊中就存在這個問題,在遨遊中的地址欄中打開智能五筆,當須要使用回退鍵來刪除錯誤輸入的編碼時,會發現刪除的不是編碼窗口中的編碼而是編輯器中的文字這是由於相似遨遊這類軟件主動接管了按鍵輸入如處理一些控制鍵,當它發現這些控制鍵不在WM_IME_STARTCOMPOSITION和WM_IME_ENDCOMPOSITION這兩個消息之間時就本身處理控制鍵而不是先交給User.exe了.
所以正確的流程應該是在開始輸入編碼時發送WM_IME_STARTCOMPOSITION,輸入結束後發送WM_IME_ENDCOMPOSITION消息.
#ImeToAsciiEx:根據輸入法上下文的內容,使用輸入法編輯器的轉換引擎產生轉換結果,將相應的字符消息放入指定緩衝區中。返回值是產生消息的條數,若是此數量大於消息緩衝區的長度,系統轉而從輸入法上下文的hMsgBuf項中讀取消息的內容。該函數和ImeProcessKey函數一塊兒構成了鍵盤輸入方式下輸入法編輯器轉換引擎的主體;資源

 

 
NotifyIME:系統或(IME有意識)應用程序通知輸入法編輯器根據參數修改輸入法編輯器的當前狀態。好比:顯示/隱藏候選窗口,選定某個候選項,更新候選窗口頁起始位置和頁尺寸,更新輸入上下文內容,修改寫做串內容等等;

 


ImeRegisterWord:向輸入法編輯器的詞典裏增長一個新詞;

 


ImeUnregisterWord:把某個詞今後輸入法編輯器的詞典裏去掉;

 


ImeGetRegisterWordStyle:取得本輸入法編輯器支持的詞風格的列表;

 


ImeEnumRegisterWord:列出符合給定條件的全部字符串。

 

/**********************************************************************/
/* UIWndProc() */
/* IME UI window procedure */
/**********************************************************************/
LRESULT WINAPI UIWndProc(HWND hUIWnd, UINT message,WPARAM wParam, LPARAM lParam)
這是一個很是重要的接口,基本上一它負責各類消息的傳遞.通常您須要在這個接口中根據不一樣的消息類型,實現輸入法窗口(如編碼窗口,重碼窗口,狀態欄窗口)的顯示隱藏及更新等操做.
這個接口實現的功能可能很是複雜,視狀況而異,在此就不作更加深刻的說明了.在使用時能夠參見示例工程.

 

StatusWndProc:狀態窗口的窗口函數.CompWndProc:寫做窗口的窗口函數.CandWndProc:候選窗口的窗口函數.

相關文章
相關標籤/搜索