windows 下的輸入法原理與設計 |
|
axsoft
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
windows 下的輸入法原理與設計 資料來源: http://wwsys.51.net/ 第一章 Windows9x系統下漢字輸入法的基本原理
Windows系統下漢字輸入法實際上是將輸入的標準ascii字符串按照一定的編碼規則轉換為漢字或漢字串,進入到目的地。由於應用程序各不相同,用戶不可能自己去設計轉換程序,因此,漢字輸入自然而然落到WINDOWS系統管理中。
一、輸入法與系統的關系 鍵盤事件 應用程序 | | Windows的USER.EXE | 輸入法管理器 | 輸入法系統的鍵盤事件有windows的user.exe軟件接收後,user.exe在將鍵盤事件傳導輸入法管理器(Input Method Manager,簡稱IMM)中,管理器 再將鍵盤事件傳到輸入法中,輸入法根據用戶編碼字典,翻譯鍵盤事件為對應的漢字(或漢字串),然後再反傳到user.exe中,user.exe再將翻譯後的鍵盤事件傳給當前正運行的應用程序,從而完成漢字的輸入。 二、漢字輸入法的組成 微軟Windows9x系統中漢字輸入法的名稱是"Input Method Editor" ,簡稱IME,輸入法的程序名稱為:*.ime,數據文件名稱為*.MB,即通常說的輸入法編碼表(字典). 實際上IME文件是一個動態連接庫程序(DLL),它與dll文件沒有區別,隻是名稱不同而已。 一般漢字輸入法都由三個窗口組成: 狀態窗口(Status Windows)-顯示當前的輸入法狀態(中文還是英文等站環信息); 編碼輸入窗口(Composition Windows)-顯示當前擊鍵情況; 漢字選擇窗口(Candidates Windows)-列出當前編碼的全部漢字(串),供用戶選擇或查詢。 上述三個窗口由基本的用戶接口(User Interface )函數管理?。 現在我們用Dumpbin.exe打開微軟提供的拼音輸入法(WINDOWS\SYSTEM\WINPY.IME)看看它有什麼組成(這裡一WINDOWS98為例,並假定windows系統安裝在c:盤下): C:\Dumpbin c:\windows\system\winpy.ime Microsoft (R) COFF Binary File Dumper Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. Dump of file WINPY.IME File Type: DLL //IME 實際為dll程序 Section contains the following exports for WINPY.ime 0 characteristics 34A37323 time date stamp Fri Dec 26 17:04:35 1997 0.00 version 1 ordinal base 19 number of functions //共有19個函數 19 number of names // 對應19個名稱 ordinal hint RVA name 1 0 0000A010 CandWndProc //"選擇漢字窗口"注冊函數 2 1 0000E750 CompWndProc //"輸入編碼窗口"注冊函數 3 2 0000FB50 ImeConfigure //配置當前ime參數函數 4 3 0000FEC0 ImeConversionList//將字符或字符串轉換成目標字符 5 4 0000FFA0 ImeDestroy //退出當前使用的IME 6 5 000030D0 ImeEnumRegisterWord 7 6 0000FFB0 ImeEscape //應用軟件訪問輸入法的接口函數. 8 7 00003080 ImeGetRegisterWordStyle 9 8 0000E9A0 ImeInquire //啟動並初始化當前IME輸入法 10 9 0000A800 ImeProcessKey //IME輸入鍵盤事件管理函數 11 A 00002C20 ImeRegisterWord //向輸入法字典注冊字符串 12 B 000109A0 ImeSelect //啟動當前IME輸入法 13 C 000109E0 ImeSetActiveContext //設置當前的輸入處於活動狀態. 14 D 0000C850 ImeSetCompositionString 由應用程序設置輸入法編碼 15 E 0000AEE0 ImeToAsciiEx //將輸入的鍵盤事件轉換為漢字編碼事件 16 F 00002F40 ImeUnregisterWord //刪除被注冊的字符串. 17 10 0000CA90 NotifyIME //IME事件管理函數 18 11 00005160 StatusWndProc //狀態窗口注冊函數 19 12 00002350 UIWndProc //用戶界面接口函數 Summary 5000 .ShareDa 7000 .data 2000 .idata 1000 .rdata 3000 .reloc 5000 .rsrc 2000 .sgroup 18000 .text 從上述可以看出,IME程序共有19個出口函數組成,每一個函數都有特定的格式,它們擔負?與windows 系統傳遞信息的作用,這些函數是供Windows系統調用的。 三、輸入法的函數簡介 下面我們將介紹上述各個函數的功能及接口格式。 1. BOOL ImeInquire( //初始化IME LPIMEINFO lpIMEInfo, //用於初始化該輸入法的結構地址 LPTSTR lpszWndClass, //當前輸入法的名稱 LPCTSTR或者dword lpszData //系統信息,9X系列值為0,NT/2000下有實際值 )如果該函數初始化成功,返回TURE,否則為FALSE 用戶應該搞清楚IMEINFO結構,特關系?你設計的輸入法是否成功.有關該結構請看"結構"一章. 2.DWORD IMEConversionList( // 將某字符或字符串轉換成目標字符串 HIMC hIMC, // 與當前輸入法相關的應用程序句柄 LPCTSTRlpSrc, // 要轉換的字符串 (也可能是結果串,可由uFlag指定) LPCANDIDATELIST lpDst, /// 轉換後的字符串(也可能是源串,可由uFlag指定) DWORD dwBufLen, //轉換後有幾個字符 UINT uFlag //指定結果的存放位置 ) 如果成功,返回轉換後的字符串長度 3.BOOL ImeConfigure( //用戶設置輸入法接口 HKL hKL, //當前輸入法句柄 HWND hWnd, //配置窗口的父窗口 DWORD dwMode, //配置什麼 LPVOID lpData //用戶設置的數據 )該函數的功能是提供給輸入法使用者一個可以更改某些隱含設置的能力. 如果你用過別人的輸入法,其中的"配置輸入法..."功能既是也! 對於一個初寫輸入法的人,可以不予理它. 4.BOOL ImeDestroy( //關閉當前輸入法 UINT uReserved //無用 (0) ) 成功返回TURE,否則為FALSE 5.LRESULT ImeEscape( //用戶軟件訪問輸入法內部信息的接口 HIMC hIMC, //當前的應用程序句柄 UINT uEscape, //設置函數功能 //=IME_ESC_QUERY _SUPPORT //=IME_ESC_RESERVED_LAST IME_ESC_RESERVED_FIRST //=IME_ESC_PRIVATE_FIRST IME_ESC_PRIVATE_LAST //=IME_ESC_SEQUENCE_TO_ INTERNAL //=IME_ESC_GET_EUDC_ DICTIONARY //=IME_ESC_SET_EUDC_ DICTIONARY //=IME_ESC_MAX_KEY //=IME_ESC_IME_NAME //=IME_ESC_SYNC_HOTKEY //=IME_ESC_HANJA_MODE //=IME_ESC_GETHELPFILENAME(隻適應 Windows 98和Windows 2000) //=IME_ESC_PRIVATE_HOTKEY(w95下不可用) LPVOID lpData //當前功能所需的數據 )如果失敗,返回0,否則有個功能決定 有時,人們可以用此函數懷區輸入法的名稱、幫助文件名稱等。當然,我們可以不提供這些功能。 6、BOOL ImeSetActiveContext( //激活或擱置當前的輸入法 HIMC hIMC, //當前用戶程序句柄 BOOL fFlag //激活或擱置:=TRUE 激活 =FALSE 擱置 ) 成功返回TRUE,否則為FALSE 7、BOOL ImeProcessKey( //處理應用程序傳入的所有擊鍵事件,監測是否是當前輸入法所需的 HIMC hIMC, //應用程序句柄 UINT uVirKey, //需處理的虛鍵 DWORD lParam, //擊鍵消息參數 CONST LPBYTE lpbKeyState //當前鍵盤狀態(256字節) ) 如果此鍵是該輸入法需要的,則返回TRUE,否則為FALSE 隻有返回true的擊鍵,IME才去處理 8、BOOL NotifyIME( //輸入法選擇窗口狀態管理函數: HIMC hIMC, //當前的應用程序句柄 DWORD dwAction, //狀態值 DWORD dwIndex, //與狀態值有關的序號 DWORD dwValue //與狀態值有關的值 ) 狀態值說明: =NI_OPENCANDIDATE 打開編碼選擇窗口 =NI_CLOSECANDIDATE 關閉當前的編碼選擇窗 =NI_SELECTCANDIDATESTR 選摘編碼 此時:dwIndex 被選擇的編碼列表序號. dwValue 被選中的編碼在當前的編碼列表中的序號 =NI_CHANGECANDIDATELIST 改變當前的編碼列表(按pageup等鍵操作) 此時:dwIndex 被選擇的編碼列表序號. dwValue 不用 =NI_SETCANDIDATE_PAGESTART 設置編碼開始頁號 此時: dwIndex 被改變的編碼列表序號 dwValue 新頁的開始序號. =NI_SETCANDIDATE_PAGESIZE 改變編碼列表頁的大小 此時:dwIndex 當前編碼頁序號 dwValue 新的頁大小 =NI_CONTEXTUPDATED 更新應用程序的信息的輸入法的信息:移動位置,設置模式,設置編碼窗口,字體。 此時:dwIndex 隻用於 dwValue=IMC_SETCONVERSIONMODE, IMC_SETSENTENCEMODE dwValue 可取由 WM_IME_CONTROL 發送的下列值: IMC_SETCANDIDATEPOS IMC_SETCOMPOSITIONFONT IMC_SETCOMPOSITIONWINDOW IMC_SETCONVERSIONMODE IMC_SETSENTENCEMODE IMC_SETOPENSTATUS =NI_COMPOSITIONSTR 改變編碼窗口中的編碼 此時:dwIndex 取下列值:CPS_COMPLETE 完成編碼轉換 CPS_CONVERT 轉換編碼 CPS_REVERT 取消當前的編碼 CPS_CANCEL 清除編碼,並關閉編碼窗 dwValue 不用 此函數成功,返回TRUE,否則為FALSE 9、BOOL ImeSelect( //初始化輸入法 HIMC hIMC, //當前應用程序句柄 BOOL fSelect //是否初始化當前輸入法,TRUE表示初始化 ) 返回:成功返回true,否則為FALSE The ImeSetCompositionString function is used by an application to set the IME composition string structure with the data contained in the lpComp or lpRead parameters. The IME then generates a message. 10、BOOL WINAPI ImeSetCompositionString( //將編碼窗口中輸入的編碼保存的編碼結構中, //同志發送編碼完成的消息 //( WM_IME_COMPOSITION)給系統, HIMC hIMC, //當前的應用程序句柄 DWORD dwIndex, //設置此函數功能 //=SCS_SETSTR //=SCS_CHANGEATTR //=SCS_CHANGECLAUSE //= SCS_QUERYRECONVERTSTRING //=SCS_RECONVERTSTRING //=SCS_SETRECONVERTSTRING LPCVOID lpComp, //編碼數據區 DWORD dwCompLen, //編碼數據區長度 LPCVOID lpRead, //讀入的編碼數據 DWORD dwReadLen //讀入的編碼數據長度 ) 11、UINT ImeToAsciiEx( //轉換編碼稱漢字(串) UINT uVirKey, //虛鍵 UINT uScanCode, //掃描碼 CONST LPBYTE lpbKeyState, //用戶定義的鍵盤狀態 LPDWORD lpdwTransBuf, //轉換後的數據存放區 UINT fuState, //活動菜單標志 HIMC hIMC //當前的應用程序句柄 ) 返回:返回值表示有幾個消息,可理解為:本編碼對應的漢字串有幾個漢字組成(當然,這並不相等)。 12、BOOL WINAPI ImeRegisterWord( LPCTSTR lpszReading, DWORD dwStyle, LPCTSTR lpszString ) 13、BOOL WINAPI ImeUnregisterWord( LPCTSTR lpszReading, DWORD dwStyle, LPCTSTR lpszString ) 14、UINT WINAPI ImeGetRegisterWordStyle( UINT nItem, LPSTYLEBUF lpStyleBuf ) 15、UINT WINAPI ImeEnumRegisterWord( hKL, REGISTERWORDENUMPROC lpfnEnumProc, LPCTSTR lpszReading, DWORD dwStyle, LPCTSTR lpszString, LPVOID lpData ) 16、DWORD WINAPI ImeGetImeMenuItems( HIMC hIMC, DWORD dwFlags, DWORD dwType, LPIMEMENUITEMINFO lpImeParentMenu, LPIMEMENUITEMINFO lpImeMenu, DWORD dwSize ) 四.ime的版本信息(與普通DLL的區別) VS_VERSION_INFO VERSIONINFO 代表字符 含義 FILEVERSION 4,0,0,950 //4.00.950 95版 PRODUCTVERSION 4,0,0,950 //4.00.950 95版 FILEFLAGSMASK 0x3fL FILEFLAGS 0xaL FILEOS 0x10004L //VOS_DOS_WINDOWS32 WIN32軟件,可在DOS下運行 FILETYPE 0x3L //VFT_DRV 驅動程序 FILESUBTYPE 0xbL //VFT2_DRV_INPUTMETHOD 輸入法驅動程序 BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "080403a8" BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "唐碼軟件開發工作室\0" VALUE "FileDescription", "唐碼輸入法 版本1.0\0" VALUE "FileVersion", "4.00.950\0" VALUE "InternalName", "唐碼輸入法 版本1.0\0" VALUE "LegalCopyright", "Copyright (C) 唐碼軟件開發工作室 1999-1999\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "TM.IME\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "唐碼輸入法 版本1.0\0" VALUE "ProductVersion", "4.00.950\0" VALUE "SpecialBuild", "\0" END 第二章 Windows9x系統提供的ime管理函數 上一章,我們介紹了ime文件中必須設計的函數,這些函數要靠我們自己來設計。要完成這些函數的設計,需用到windows系統提供的管理函數(Input Method Manager,簡稱IMM)。 IMM函數可以被IME函數使用,也可用於應用軟件直接管理IME。 相關術語: (1)input method context 簡稱IMC--輸入法相關部分,在這裡解釋為:相關連的應用程序(進程) (2)component of the input context 簡稱IMCC--IMC的部件,是INPUTCONTEXT 結構的成員。 一、IME中使用的IMM函數清單 ImmGetCompositionWindow //取編碼窗口信息 ImmSetCompositionWindow //設置編碼窗口信息 ImmGetCandidateWindow //取選擇窗口信息 ImmSetCandidateWindow //設置選擇窗口信息 ImmGetCompositionString //取編碼窗口的某一信息 ImmSetCompositionString //設置編碼窗口的某一信息 ImmGetCompositionFont //取編碼字體 ImmSetCompositionFont //設置編碼字體 ImmGetNumCandidateList //取選擇區中編碼數 ImmGetCandidateList //取選擇區中編碼 ImmGetGuideLine ImmGetConversionStatus //取當前輸入法的狀態(ACSII,SHAPE,FULL等) ImmGetConversionList //重新獲得選擇區轉換表 ImmGetOpenStatus //取輸入法打開屬性 ImmSetConversionStatus //設置輸入法狀態 ImmSetOpenStatus //設置輸入法打開狀態 ImmNotifyIME //通報IME,輸入法狀態被改變 ImmGenerateMessage //將我們的漢字串法發送到與當前輸入法相關聯的應用軟件中 ImmRequestMessage //向應用程序發送WM_IME_REQUEST ImmLockIMC //獲取當前IMC的INPUTCONTEXT結構信息,增加IMC 計數器 ImmUnlockIMC //釋放IMC計數器 ImmGetIMCLockCount //取計數器值 ImmCreateIMCC //創建INPUTCONTEXT結構的一個成員 ImmDestroyIMCC //刪除IMC成員緩沖區 ImmLockIMCC //取IMCC緩沖地址,同時使IMCC的計數器值增加 ImmUnlockIMCC //遞減IMCC計數器 ImmReSizeIMCC //重新設置IMC的成員的緩沖區大小 ImmGetIMCCSize //取IMC成員的緩沖區大小 ImmGetIMCCLockCount //返回IMC計數器值 ImmGetHotKey //取輸入法狀態鍵,該函數供控制面板使用 ImmSetHotKey //設置輸入法的熱鍵 ImmCreateSoftKeyboard //產生一個軟鍵盤 ImmDestroySoftKeyboard //銷毀軟鍵盤 ImmShowSoftKeyboard //顯示或隱藏軟鍵盤 二、IMM函數使用格式說明 1、BOOL WINAPI ImmGenerateMessage( //將我們的漢字串法發送到與當前輸入法相關聯的應用軟件中 HIMC hIMC //與當前輸入法相關聯的應用軟件的句柄, //該結構的hMsgBuf項即為漢字串消息 ) 成功為TRUE,否則為FALSE 2、LRESULT WINAPI ImmRequestMessage( //向應用程序發送WM_IME_REQUEST //隻是用於w98及w2000 HIMC hIMC, //與當前輸入法相關聯的應用軟件的句柄 WPARAM wParam, //與WM_IME_REQUEST相關的wP LPARAM lParam //與WM_IME_REQUEST相關的LP //=IMR_COMPOSITIONWINOW //=IMR_CANDIDATEWINDOW //=IMR_COMPOSITIONFONT //=IMR_RECONVERTSTRING //=IMR_CONFIRMRECONVERTSTRING //=IMR_QUERYCHARPOSITION //=IMR_DOCUMENTFEED ) 3、LPINPUTCONTEXT WINAPI ImmLockIMC( //獲取當前IMC的INPUTCONTEXT結構信息,增加IMC 計數器 HIMC hIMC //當前應用程序句柄 ) 成功返回INPUTCONTEXT 結構指針,否則為NULL 4、BOOL WINAPI ImmUnlockIMC( //釋放IMC計數器 HIMC hIMC //當前應用程序句柄 ) 返回:如果IMC計數器被減少到0了,返回FALSE,否則為TRUE. 注意:ImmLockIMC與ImmUnlockIMC必須成對出現,必須是相同的HIMC 5、HIMCC WINAPI ImmGetIMCLockCount( //取計數器值 HIMC hIMC //當前應用程序句柄 ) 如果成功返回HIMC的計數器值,否則為NULL. 6、HIMCC WINAPI ImmCreateIMCC( //創建INPUTCONTEXT結構的一個成員 DWORD dwSize //成員的緩沖區長度 ) 如果成功返回IMC的成員句柄,否則為NULL 7、HIMCC WINAPI ImmDestroyIMCC( //刪除IMC成員緩沖區 HIMCC hIMCC //被刪除的IMC的成員 ) 如果成功返回NULL,否則等於該HIMCC. 8、LPVOID WINAPI ImmLockIMCC( //取IMCC緩沖地址,同時使IMCC的計數器值增加 HIMCC hIMCC //IMC成員句柄 ) If the function is successful, the return value is the pointer for the IMC component. Otherwise, the return value is NULL. 9、BOOL WINAPI ImmUnlockIMCC( //遞減IMCC計數器 HIMCC hIMCC //IMC成員句柄 ) 如果IMCC的計數器值為零,則返回 FALSE,否則為TRUE. 10、HIMCC WINAPI ImmReSizeIMCC( //重新設置IMC的成員的緩沖區大小 HIMCC hIMCC, //IMC的成員句柄 DWORD dwSize //新緩沖區大小 ) 如果成功,返回新的HIMCC,否則為 NULL. 11、DWORD WINAPI ImmGetIMCCSize( //取IMC成員的緩沖區大小 HIMCC hIMCC //IMC成員句柄 ) 返回IMC成員的緩沖區大小 12、DWORD WINAPI ImmGetIMCCLockCount( //返回IMC計數器值 HIMCC hIMCC //IMC成員的句柄 ) 成功返回該IMCC的計數器值,否則為0 13、BOOL WINAPI ImmGetHotKey( //取輸入法狀態鍵,該函數供控制面板使用 DWORD dwHotKeyID, LPUINT lpuModifiers, LPUINT lpuVKey, LPHKL lphKL ) 14、BOOL WINAPI ImmSetHotKey( //設置輸入法的熱鍵 DWORD dwHotKeyID, UINT uModifiers, UINT uVKey, hKL hKL ) 15、HWND WINAPI ImmCreateSoftKeyboard( //產生一個軟鍵盤 UINT uType, //軟件盤上的鍵碼含義的定義方式 //=SOFTKEYBOARD_TYPE_T1 //=SOFTKEYBOARD_TYPE_C1 UINT hOwner, //該輸入法的UI窗口 int x, //定位坐標 int y //定位坐標 ) 成功返回軟鍵盤的窗口句柄 16、BOOL WINAPI ImmDestroySoftKeyboard( //銷毀軟鍵盤 HWND hSoftKbdWnd //軟年盤窗口句柄 ) 成功為TRUE,法哦則為FALSE. 17、BOOL WINAPI ImmShowSoftKeyboard( //顯示或隱藏軟鍵盤 HWND hSoftKbdWnd, //軟年盤窗口句柄 int nCmdShow //窗口狀態=SW_HIDE 表示隱藏,=SW_SHOWNOACTIVATE表示顯示 ) 如構成功返回 TRUE. 否則為 FALSE. 第三章 ime文件中必須使用的結構 前二章我們講述了ime和imm函數,二者之間是靠下列結構通訊的。 1、IMEINFO struct tagIMEInfo { //輸入法的接口信息 用於ImeInquire函數中 DWORD dwPrivateDataSize;//用戶設計的數據結構的字節數 DWORD fdwProperty; //輸入法對鍵盤事件的相應特性 //其中其高字可為下列字節位的組合: //=IME_PROP_AT_CARET 轉換窗口是否放置在需插入字符的位置 //=IME_PROP_SPECIAL_UI 該輸入法具有特殊用戶接口 //=IME_PROP_CANDLIST_START_FROM_1 輸入法的選擇窗口中漢字串的起始序號為1 //=IME_PROP_UNICODE 支持UNICODE字符 //其中其低字可為下列字節位的組合: //=IME_PROP_END_UNLOAD //=IME_PROP_KBD_CHAR_FIRST 首先由鍵盤轉換字符 //=IME_PORP_NEED_ALTKEY 將ALT鍵盤事件傳送到IME輸入法內 //=IME_PROP_IGNORE_UPKEYS 禁止上位鍵事件進入輸入法內 //=IME_PROP_COMPLETE_ON_UNSELECT 當關閉輸入法時,完成編碼的轉換 // 用於 W98及2000 中 DWORD fdwConversionCaps;//當前輸入法具有的功能特性,如有軟鍵、標點、中西文切換等功能 //=IME_CMODE_NATIVE 設置活動模式 //=IME_CMODE_FULLSHAPE 設置全角模式 //=IME_CMODE_CHARCODE 設置為字符模式 //=IME_CMODE_SOFTKBD //設置軟鍵盤模式 //=IME_CMODE_NOCONVERSION //不支持模式變換 //=IME_CMODE_EUDC // //=IME_CMODE_SYMBOL //設置標點字符模式 DWORD fdwSentenceCaps; // //=IME_SMODE_PLAURALCLAUSE //=IME_SMODE_SINGLECONVERT //=IME_SMODE_AUTOMETIC //=IME_SMODE_CONVERSATION DWORD fdwUICaps; // 用戶界面能力:支持軟鍵盤等 //=UI_CAP_2700 //=UI_CAP_ROT90 //=UI_CAP_ROTANY //=UI_CAP_SOFKBD DWORD fdwSCSCaps; // 用戶設置編碼串的能力 //=SCS_CAP_COMPSTR //=SCS_CAP_MAKEREAD DWORD fdwSelectCaps; // 輸入法切換時是否使用以前輸入法的模式 //=SELECT_CAP_CONVMODE //=SELECT_CAP_SENTENCE } IIMEINFO; 2、COMPOSITIONSTR 用於編碼管理 typedef struct tagCOMPOSITIONSTR { //用於存放編碼信息的信息:所有的實際信息放在本結構的後面 DWORD dwSize; //當前編碼信息需要的存儲空間=讀入的編碼 屬性 子串 屬性 編碼 屬性 結果 屬性 DWORD dwCompReadAttrLen; //讀入的編碼屬性長度 DWORD dwCompReadAttrOffset; //存放在內存的位置 DWORD dwCompReadClsLen; //讀入的子串長度 DWORD dwCompReadClsOffset; //存放在內存的位置 DWORD dwCompReadStrLen; //讀入的編碼長度 DWORD dwCompReadStrOffset; //存放在內存的位置 DWORD dwCompAttrLen; //編碼屬性長度 DWORD dwCompAttrOffset; //存放在內存的位置 DWORD dwCompClsLen; //編碼子串長度 DWORD dwCompClsOffset; //存放在內存的位置 DWORD dwCompStrLen; //編碼串長度 DWORD dwCompStrOffset; //存放在內存的位置 DWORD dwCursorPos; //當前光標位置 DWORD dwDeltaStart; //被修改編碼的位置 DWORD dwResultReadClsLen; //讀入結果子串長度 DWORD dwResultReadClsOffset; //存放在內存的位置 DWORD dwResultReadStrLen; //讀入的編碼長度 DWORD dwResultReadStrOffset; //存放在內存的位置 DWORD dwResultClsLen; //結果子串長度 DWORD dwResultClsOffset; //存放在內存的位置 DWORD dwResultStrLen; //結果串長度 DWORD dwResultStrOffset; //存放在內存的位置 DWORD dwPrivateSize; //用戶自定義數據長度 DWORD dwPrivateOffset; //存放在內存的位置 } COMPOSITIONSTR; 3、CANDIDATEINFO 用於編碼選擇管理 typedef struct tagCANDIDATEINFO { //編碼選擇信息的信息,其後為實際編碼列表數據 DWORD dwSize; //數據所佔內存大小 DWORD dwCount; //表馬列表個數 DWORD dwOffset[32]; //各個編碼列表的內存位置 DWORD dwPrivateSize; //自定義數據尺寸 DWORD dwPrivateOffset; //緩沖區位置 } CANDIDATEINFO; 4、GUIDELINE typedef struct tagGUIDELINE { DWORD dwSize; DWORD dwLevel; // the error level. // GL_LEVEL_NOGUIDELINE, // GL_LEVEL_FATAL, // GL_LEVEL_ERROR, // GL_LEVEL_WARNNING, // GL_LEVEL_INFORMATION DWORD dwIndex; // GL_ID_NODICTIONARY and so on. DWORD dwStrLen; // Error Strings, if this is 0, there // is no error string. DWORD dwStrOffset; DWORD dwPrivateSize; DWORD dwPrivateOffset; } GUIDELINE; 5、CANDIDATELIST The CANDIDATELIST structure contains information about a candidate list. typedef struct tagCANDIDATELIST { //編碼選擇列表信息 =〉管理編碼窗口中的列表信息 DWORD dwSize; // 用字節表示的內存大小:=sizeof(CANDIDATELIST) 選擇字符數據 DWORD dwStyle; // 列表串的取值方式 //=IME_CAND_UNKNOWN 列表數據的格式無定義 //=IME_CAND_READ 讀到什麼數據即為什麼數據,一般我們使用該屬性 //=IME_CAND_CODE 如果dwCount=1,dwOffset不是地址,而是實際數據, // >1 dwOffset 表示地址 //=IME_CAND_MEANING //=IME_CAND_RADICAL //=IME_CAND_STROKES DWORD dwCount; // 當前列表個數 DWORD dwSelection; // 當前選擇的列表序號 DWORD dwPageStart; // 在列表窗口中所顯示的列表的起始序號(上下翻頁時用) DWORD dwPageSize; // 一頁顯示的列表個數 DWORD dwOffset[]; // 列表數據存放區地址:[阿];[大]。。。。 } CANDIDATELIST; 6、COMPOSITIONFORM typedef tagCOMPOSITIONFORM { //窗口位置、大小信息: //由IMC_SETCOMPOSITIONWINDOW和IMC_SETCANDIDATEPOS消息使用 DWORD dwStyle; //管理窗口方式 //=CFS_DEFAULT 將編碼窗口顯示到隱含的位置 //=CFS_FORCE_POSITION // 以給定的坐標顯示窗口,不受IME控制 //=CFS_POINT // 以給定的坐標顯示窗口,受IME控制 //=CFS_RECT //以給定的大小顯示窗口 POINT ptCurrentPos; //給定坐標 RECT rcArea; //給定窗口的小 }COMPOSITIONFORM; 7、CANDIDATEFORM The CANDIDATEFORM structure is used for IMC_GETCANDIDATEPOS and IMC_SETCANDIDATEPOS messages. typedef tagCANDIDATEFORM { //列表窗口信息 //由IMC_GETCANDIDATEPOS和IMC_SETCANDIDATEPOS消息處理 DWORD dwIndex; //列表窗口序號 DWORD dwStyle; //屬性: //=CFS_CANDIDATEPOS 指定顯示位置 //=CFS_EXCLUDE 不可顯示 //=CFS_DEFAULT 根據需要顯示 POINT ptCurrentPos; //坐標位置 REC rcArea; //不可顯示區 } CANDIDATEFORM; 8、STYLEBUF typedef struct tagSTYLEBUF { //注冊字結構 DWORD dwStyle; TCHAR szDescription[32] } STYLEBUF; 9、SOFTKBDDATA typedef struct tagSOFTKBDDATA { //軟鍵盤中各鍵對應的漢字 UINT uCount; //鍵碼數組個數(可以為1,2,當區分SHIFT鍵時為2,即:一組帶SHIFT,一組不帶SHIFT) WORD wCode[][256] //對應的鍵碼數據 } SOFTKBDDATA; 10、RECONVERTSTRING typedef struct _tagRECONVERTSTRING { //用於W98和2000 DWOPD dwSize; DWORD dwVersion; DWORD dwStrLen; DWORD dwStrOffset; DWORD dwCompStrLen; DWORD dwCompStrOffset; DWORD dwTargetStrLen; DWORD dwTargetStrOffset; } RECONVERTSTRING; 11、IMEMENUITEMINFO typedef _tagIMEMENUITEMINFO { //輸入法菜單結構,W98/2000 UINT cbSize; UINT fType; UINT fState; UINT wID; HBITMAP hbmpChecked; HBITMAP hbmpUnchecked; DWORD dwItemData; TCHAR szString[48]; HBITMAP hbmpItem; } 12、INPUTCONTEXT The INPUTCONTEXT structure is an internal data structure that stores Input Context data. typedef struct tagINPUTCONTEXT { //IMC 數據存放區 HWND hWnd; //使用該IMC的窗口 BOOL fOpen; //IME的打開與關閉狀態 POINT ptStatusWndPos; //狀態窗口的位置 POINT ptSoftKbdPos; //軟鍵盤的位置 DWORD fdwConversion; //IME狀態(活動、不活動,全角等) DWORD fdwSentence; //編碼方式 union { LOGFONTA A; LOGFONTW W; } lfFont; //字體 COMPOSITIONFORM cfCompForm; //編碼格式結構 CANDIDATEFORM cfCandForm[4]; //列表選擇結構 HIMCC hCompStr; // HIMCC hCandInfo; HIMCC hGuideLine HIMCC hPrivate; DWORD dwNumMsgBuf; //存放在hMsgBuf中的消息數 HIMCC hMsgBuf; //存放的消息,格式: [消息1] [wParam1] [lParam1] {[消息] [wParam2] [lParam2]... //注意:我們輸入的漢字串存放在這裡 DWORD fdwInit //系統根據此值來初始本結構相應的信息 //=INIT_STATUSWNDPOS 初始化ptStatusWndPos //=INIT_CONVERSION 初始化fdwConversion |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |