Windows 中文輸入法的實現 |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
Windows 中文輸入法的實現 作者:3jaja 資料來源:
http://www.csdn.net/Develop/article/16/16998.shtm 本人設計了一個「3 輸入法」,可運行操作系統 Windows95/98/NT/2000,「3 輸入法」為純形碼,無需識別碼,易學,易用,錄入速度快,含「簡體、繁體、專業」三種版本,字根量小,詞組數大於26000個,全部重碼數僅為73個,您可以在 http://www.csdn.net/cnshare/ 下搜索「3 輸入法」下載軟件,或在:http://www.anycities.com/user1/3jj/ 下載。歡迎各位試用並提出寶貴意見。如有問題可發Email:w3jj@yahoo.com.cn 給我。
限於篇幅,Windows系統下漢字輸入法的基本原理,大家可參考 MSDN 中的有關文檔。本人僅對程序設計的實現方法說明如下: 一、在 Windows 任務欄中增加輸入法名稱 這也就是 Setup 程序的關鍵,實際上,可以利用 ImmInstallIME 函數。該函數的原形是:HKL ImmInstallIME( LPCTSTR lpszIMEFileName, LPCTSTR lpszLayoutText);前一個參數 lpszIMEFileName 是「.ime」文件的路徑,Win9x 為「\System」下,WinNT/2000為「\System32」下。後一個參數 lpszLayoutText 是輸入法的明稱。如 HKL MyIme=ImmInstallIME("Windows\\system\\3jaja.ime","3 輸入法"); 如果 MyIme 不返回 NULL ,則調用成功。
當然你必須先設計好 DLL 程序「.ime」文件和碼表原文件「.mb」文件。 二、「.ime」文件的實現
程序中的輸出函數(必須)即文件「.def」中的函數,以下為函數的名稱和原形,部分函數給出了原函數,希望對你能有所幫助。 //初始化輸入法函數
BOOL WINAPI ImeInquire(LPIMEINFO lpImeInfo,LPTSTR lpszWndCls,DWORD lpszOptions) { if (!lpImeInfo) return (FALSE); lpImeInfo->dwPrivateDataSize = sizeof(PRIVCONTEXT); lpImeInfo->fdwProperty = IME_PROP_KBD_CHAR_FIRST| IME_PROP_CANDLIST_START_FROM_1| IME_PROP_IGNORE_UPKEYS; lpImeInfo->fdwConversionCaps = IME_CMODE_NATIVE|IME_CMODE_NATIVE|IME_CMODE_FULLSHAPE|IME_CMODE_CHARCODE|IME_CMODE_SOFTKBD|IME_CMODE_NOCONVERSION; lpImeInfo->fdwSentenceCaps = 0; lpImeInfo->fdwUICaps = UI_CAP_ROT90|UI_CAP_SOFTKBD; lpImeInfo->fdwSCSCaps = SCS_CAP_COMPSTR|SCS_CAP_MAKEREAD; lpImeInfo->fdwSelectCaps = (DWORD)0; lstrcpy(lpszWndCls, (LPTSTR)szUIClassName); return (TRUE); }//自定義漢字編碼格式,未作處理。 DWORD WINAPI ImeConversionList(HIMC hIMC,LPCTSTR lpszSrc,DWORD uBufLen,UINT uFlag) { return (0); }//設置輸入法狀態函數,如光標跟隨等 BOOL WINAPI ImeConfigure(HKL hKL,HWND hAppWnd,DWORD dwMode,LPVOID lpData) { switch (dwMode) { case IME_CONFIG_GENERAL: DialogBox(hInst, MAKEINTRESOURCE(SETIME), (HWND)hAppWnd, (DLGPROC)ImeSetDlgProc); break; default: return (FALSE); break; } return (TRUE); }//退出 BOOL WINAPI ImeDestroy(UINT uReserved) { if (uReserved) return (FALSE); return (TRUE); } //應用接口函數 LRESULT WINAPI ImeEscape(HIMC hIMC,UINT uSubFunc,LPVOID lpData) { LRESULT lRet; switch (uSubFunc) { case IME_ESC_QUERY_SUPPORT: if ( lpData == NULL ) return FALSE; switch (*(LPUINT)lpData) { case IME_ESC_QUERY_SUPPORT: case IME_ESC_MAX_KEY: case IME_ESC_IME_NAME: case IME_ESC_GETHELPFILENAME: return (TRUE); case IME_ESC_SEQUENCE_TO_INTERNAL: case IME_ESC_GET_EUDC_DICTIONARY: case IME_ESC_SET_EUDC_DICTIONARY: case IME_INPUTKEYTOSEQUENCE: return (FALSE); default: return (FALSE); } break; case IME_ESC_SEQUENCE_TO_INTERNAL: case IME_ESC_GET_EUDC_DICTIONARY: case IME_ESC_SET_EUDC_DICTIONARY: case IME_INPUTKEYTOSEQUENCE: return (FALSE); case IME_ESC_MAX_KEY: return ((WORD) 4); case IME_ESC_GETHELPFILENAME: { TCHAR szIMEGUDHlpName[MAXSTRLEN]; if (lpData == NULL ) return FALSE; szIMEGUDHlpName[0] = 0; GetWindowsDirectory((LPTSTR)szIMEGUDHlpName, MAXSTRLEN); lstrcat((LPTSTR)szIMEGUDHlpName, TEXT("\\HELP\\3JaJa.hlp")); lstrcpy((char*)lpData, (char*)szIMEGUDHlpName); return TRUE; } default: return (FALSE); } return (lRet); } //啟動輸入法設置功能 BOOL WINAPI ImeSelect(HIMC hIMC,BOOL fSelect) { LPINPUTCONTEXT lpIMC; BOOL fRet; if (!hIMC) return (FALSE); lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); if (!lpIMC) return (FALSE); fRet = Select(hIMC, lpIMC, fSelect); ImmUnlockIMC(hIMC); return (fRet); } //設置輸入活動狀態 BOOL WINAPI ImeSetActiveContext(HIMC hIMC,BOOL fOn) { if (fOn&&hIMC) { LPINPUTCONTEXT lpIMC; lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); if (!lpIMC) return (FALSE); InitContext(lpIMC); ImmUnlockIMC(hIMC); } return (TRUE); }//用戶按鍵處理函數,例如中英文狀態,返回 FALSE 為英文狀態,按鍵不作處理。 BOOL WINAPI ImeProcessKey(HIMC hIMC,UINT uVirtKey,LPARAM lParam,CONST LPBYTE lpbKeyState); //輸入法編碼字符處理。 BOOL WINAPI ImeSetCompositionString(HIMC hIMC,DWORD dwIndex,LPVOID lpComp, DWORD dwCompLen,LPVOID lpRead,DWORD dwReadLen); //將用戶按鍵轉換為漢字編碼 UINT WINAPI ImeToAsciiEx(UINT uVirtKey,UINT uScanCode,CONST LPBYTE lpbKeyState,LPTRANSMSGLIST lpTransBuf,UINT fuState,HIMC hIMC) //處理IME消息函數 BOOL WINAPI NotifyIME(HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue); //自定義漢字編碼格式,未作處理。 BOOL WINAPI ImeRegisterWord(LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString) { return (FALSE); } //自定義漢字編碼格式,未作處理。 BOOL WINAPI ImeUnregisterWord(LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString) { return (FALSE); } //自定義漢字編碼格式,未作處理。 UINT WINAPI ImeGetRegisterWordStyle(UINT nItem,LPSTYLEBUF lpStyleBuf) { return (FALSE); } //自定義漢字編碼格式,未作處理。 UINT WINAPI ImeEnumRegisterWord(REGISTERWORDENUMPROC lpfnRegisterWordEnumProc, LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString,LPVOID lpData) { return (FALSE); } //UI窗口過程 LRESULT CALLBACK UIWndProc(HWND hUIWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch (uMsg) { case WM_CREATE: CreateUIWindow(hUIWnd); break; case WM_DESTROY: DestroyUIWindow(hUIWnd); break; case WM_IME_STARTCOMPOSITION: …… } //狀態窗口過程 LRESULT CALLBACK StatusWndProc(HWND hStatusWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); //編碼窗口過程 LRESULT CALLBACK CompWndProc(HWND hCompWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); //侯選漢字窗口過程 LRESULT CALLBACK CandWndProc(HWND hCandWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);三、頭文件及鏈接文件 記得要定義 IMM32.h 及鏈接文件 IMM32.lib。至於有關「 .ime」程序中必須用到的結構,大家可參考 MSDN 中的有關文檔。 網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |