分享
 
 
 

Windows中文输入法的实现

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Windows 中文输入法的实现

本人设计了一个“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 中的有关文档。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有