输入法(IME)实现原理

输入法(IME)实现原理一、实现原理1.中文输入法的组成微软 Windows 系统中输入法由程序(DLL)名称为:*.ime文件和码表文件(字典)名称为*.mb文件组成。2.中文输入法的界面http://wjy.hanwenhua.com/images/Projec6.gif3.在 Windows 任务栏“EN图标”中增加输入法名称这也就是 Setup 程序的关键,实际上,可以利用 Win32Api 函数 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 ,则调用成功。4.“.ime”文件的实现程序中的输出函数(必须)即文件“.def”中的函数,以下为函数的名称和原形,部分函数给出了原函数,希望对你能有所帮助。BOOL WINAPI ImeInquire(LPIMEINFO lpImeInfo,LPTSTR lpszWndCls,DWORD lpszOptions) { 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); } DWORD WINAPI ImeConversionList(HIMC hIMC,LPCTSTR lpszSrc,DWORD uBufLen,UINT uFlag) { } BOOL WINAPI ImeConfigure(HKL hKL,HWND hAppWnd,DWORD dwMode,LPVOID lpData) { { DialogBox(hInst, MAKEINTRESOURCE(SETIME), (HWND)hAppWnd, (DLGPROC)ImeSetDlgProc); } } BOOL WINAPI ImeDestroy(UINT uReserved) { } LRESULT WINAPI ImeEscape(HIMC hIMC,UINT uSubFunc,LPVOID lpData) { { case IME_ESC_QUERY_SUPPORT: { case IME_ESC_QUERY_SUPPORT: case IME_ESC_GETHELPFILENAME: case IME_ESC_SEQUENCE_TO_INTERNAL: case IME_ESC_GET_EUDC_DICTIONARY: case IME_ESC_SET_EUDC_DICTIONARY: case IME_INPUTKEYTOSEQUENCE: } case IME_ESC_SEQUENCE_TO_INTERNAL: case IME_ESC_GET_EUDC_DICTIONARY: case IME_ESC_SET_EUDC_DICTIONARY: case IME_INPUTKEYTOSEQUENCE: case IME_ESC_GETHELPFILENAME: { TCHAR szIMEGUDHlpName[MAXSTRLEN]; szIMEGUDHlpName[0] = 0; GetWindowsDirectory((LPTSTR)szIMEGUDHlpName, MAXSTRLEN); lstrcat((LPTSTR)szIMEGUDHlpName, TEXT("file://HELP//3JaJa.hlp")); lstrcpy((char*)lpData, (char*)szIMEGUDHlpName); } } } BOOL WINAPI ImeSelect(HIMC hIMC,BOOL fSelect) { LPINPUTCONTEXT lpIMC; lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); fRet = Select(hIMC, lpIMC, fSelect); ImmUnlockIMC(hIMC); } BOOL WINAPI ImeSetActiveContext(HIMC hIMC,BOOL fOn) { { LPINPUTCONTEXT lpIMC; lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); InitContext(lpIMC); ImmUnlockIMC(hIMC); } } 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) BOOL WINAPI NotifyIME(HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue); BOOL WINAPI ImeRegisterWord(LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString) { } BOOL WINAPI ImeUnregisterWord(LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString) { } UINT WINAPI ImeGetRegisterWordStyle(UINT nItem,LPSTYLEBUF lpStyleBuf) { } UINT WINAPI ImeEnumRegisterWord(REGISTERWORDENUMPROC lpfnRegisterWordEnumProc, LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString,LPVOID lpData) { } LRESULT CALLBACK UIWndProc(HWND hUIWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { { CreateUIWindow(hUIWnd); DestroyUIWindow(hUIWnd); case WM_IME_STARTCOM } } 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); BOOL WINAPI ImeInquire(LPIMEINFO lpImeInfo,LPTSTR lpszWndCls,DWORD lpszOptions) { 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); } DWORD WINAPI ImeConversionList(HIMC hIMC,LPCTSTR lpszSrc,DWORD uBufLen,UINT uFlag) { } BOOL WINAPI ImeConfigure(HKL hKL,HWND hAppWnd,DWORD dwMode,LPVOID lpData) { { DialogBox(hInst, MAKEINTRESOURCE(SETIME), (HWND)hAppWnd, (DLGPROC)ImeSetDlgProc); } } BOOL WINAPI ImeDestroy(UINT uReserved) { } LRESULT WINAPI ImeEscape(HIMC hIMC,UINT uSubFunc,LPVOID lpData) { { case IME_ESC_QUERY_SUPPORT: { case IME_ESC_QUERY_SUPPORT: case IME_ESC_GETHELPFILENAME: case IME_ESC_SEQUENCE_TO_INTERNAL: case IME_ESC_GET_EUDC_DICTIONARY: case IME_ESC_SET_EUDC_DICTIONARY: case IME_INPUTKEYTOSEQUENCE: } case IME_ESC_SEQUENCE_TO_INTERNAL: case IME_ESC_GET_EUDC_DICTIONARY: case IME_ESC_SET_EUDC_DICTIONARY: case IME_INPUTKEYTOSEQUENCE: case IME_ESC_GETHELPFILENAME: { TCHAR szIMEGUDHlpName[MAXSTRLEN]; szIMEGUDHlpName[0] = 0; GetWindowsDirectory((LPTSTR)szIMEGUDHlpName, MAXSTRLEN); lstrcat((LPTSTR)szIMEGUDHlpName, TEXT("file://HELP//3JaJa.hlp")); lstrcpy((char*)lpData, (char*)szIMEGUDHlpName); } } } BOOL WINAPI ImeSelect(HIMC hIMC,BOOL fSelect) { LPINPUTCONTEXT lpIMC; lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); fRet = Select(hIMC, lpIMC, fSelect); ImmUnlockIMC(hIMC); } BOOL WINAPI ImeSetActiveContext(HIMC hIMC,BOOL fOn) { { LPINPUTCONTEXT lpIMC; lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); InitContext(lpIMC); ImmUnlockIMC(hIMC); } } 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) BOOL WINAPI NotifyIME(HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue); BOOL WINAPI ImeRegisterWord(LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString) { } BOOL WINAPI ImeUnregisterWord(LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString) { } UINT WINAPI ImeGetRegisterWordStyle(UINT nItem,LPSTYLEBUF lpStyleBuf) { } UINT WINAPI ImeEnumRegisterWord(REGISTERWORDENUMPROC lpfnRegisterWordEnumProc, LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString,LPVOID lpData) { } LRESULT CALLBACK UIWndProc(HWND hUIWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { { CreateUIWindow(hUIWnd); DestroyUIWindow(hUIWnd); case WM_IME_STARTCOM } } 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); 5.头文件及链接文件记得要定义 IMM32.h 及链接文件 IMM32.lib。至于有关“ .ime”程序中必须用到的结构,大家可参考 MSDN 中的有关文档。二、常用函数BOOL WINAPI ImmGenerateMessage( //将汉字串法发送到与当前输入法相关联的应用软件中HIMC hIMC);//成功为TRUE,否则为FALSELRESULT WINAPI ImmRequestMessage( //向应用程序发送WM_IME_REQUEST消息HIMC hIMC, //与当前输入法相关联的应用软件的句柄WPARAM wParam, //与WM_IME_REQUEST相关的wPLPARAM lParam //与WM_IME_REQUEST相关的LP);LPINPUTCONTEXT WINAPI ImmLockIMC( //获取当前IMC的INPUTCONTEXT结构信息,增加IMC 计数器HIMC hIMC);//成功返回INPUTCONTEXT 结构指针,否则为NULLBOOL WINAPI ImmUnlockIMC( //释放IMC计数器HIMC hIMC );//返回:如果IMC计数器被减少到0了,返回FALSE,否则为TRUE.注意:ImmLockIMC与ImmUnlockIMC必须成对出现,必须是相同的HIMCHIMCC WINAPI ImmGetIMCLockCount( //取计数器值HIMC hIMC );//如果成功返回HIMC的计数器值,否则为NULL.HIMCC WINAPI ImmCreateIMCC( //创建INPUTCONTEXT结构的一个成员DWORD dwSize //成员的缓冲区长度);//如果成功返回IMC的成员句柄,否则为NULLHIMCC WINAPI ImmDestroyIMCC( //删除IMC成员缓冲区HIMCC hIMCC);//如果成功返回NULL,否则等于该HIMCC.LPVOID WINAPI ImmLockIMCC( //取IMCC缓冲地址,同时使IMCC的计数器值增加HIMCC hIMCC );BOOL WINAPI ImmUnlockIMCC( //递减IMCC计数器HIMCC hIMCC );//如果IMCC的计数器值为零,则返回 FALSE,否则为TRUE.10、HIMCC WINAPI ImmReSizeIMCC( //重新设置IMC的成员的缓冲区大小HIMCC hIMCC, //IMC的成员句柄DWORD dwSize //新缓冲区大小);//如果成功,返回新的HIMCC,否则为 NULL.DWORD WINAPI ImmGetIMCCSize( //取IMC成员的缓冲区大小HIMCC hIMCC );//返回IMC成员的缓冲区大小12、DWORD WINAPI ImmGetIMCCLockCount( //返回IMC计数器值HIMCC hIMCC);//成功返回该IMCC的计数器值,否则为0BOOL WINAPI ImmGetHotKey( //取输入法状态键,该函数供控制面板使用DWORD dwHotKeyID,LPUINT lpuModifiers,LPUINT lpuVKey,LPHKL lphKL)BOOL WINAPI ImmSetHotKey( //设置输入法的热键DWORD dwHotKeyID,UINT uModifiers,UINT uVKey,hKL hKL)HWND WINAPI ImmCreateSoftKeyboard( //产生一个软键盘UINT uType, //软件盘上的键码含义的定义方式UINT hOwner, //该输入法的UI窗口int x, //x坐标int y //y坐标);//成功返回软键盘的窗口句柄BOOL WINAPI ImmDestroySoftKeyboard( //销毁软键盘HWND hSoftKbdWnd //软键盘窗口句柄);//成功为TRUE,法哦则为FALSE.17、BOOL WINAPI ImmShowSoftKeyboard( //显示或隐藏软键盘HWND hSoftKbdWnd, //软键盘窗口句柄int nCmdShow //SW_HIDE=隐藏,SW_SHOWNOACTIVATE=显示);//如构成功返回 TRUE. 否则为 FALSE.二、 IME 文件中的常用结构1、IMEINFOstruct tagIMEInfo { //输入法的接口信息DWORD dwPrivateDataSize;//用户设计的数据结构的字节数 DWORD fdwProperty; //输入法对键盘事件的相应特性DWORD fdwConversionCaps;//当前输入法具有的功能特性,如有软键盘、标点、中西文切换等功能 DWORD fdwSentenceCaps; DWORD fdwUICaps; // 用户界面能力:支持软键盘等DWORD fdwSCSCaps; // 用户设置编码串的能力DWORD fdwSelectCaps; // 输入法切换时是否使用以前输入法的模式} 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、GUIDELINEtypedef struct tagGUIDELINE {DWORD dwSize;DWORD dwLevel;DWORD dwIndex;DWORD dwStrLen;DWORD dwStrOffset;DWORD dwPrivateSize;DWORD dwPrivateOffset; } GUIDELINE;5、CANDIDATELIST 编码选择列表信息typedef struct tagCANDIDATELIST { DWORD dwSize; // 用字节表示的内存大小DWORD dwStyle; // 列表串的取值方式DWORD dwCount; // 当前列表个数DWORD dwSelection; // 当前选择的列表序号DWORD dwPageStart; // 在列表窗口中所显示的列表的起始序号DWORD dwPageSize; // 一页显示的列表个数DWORD dwOffset[]; // 列表数据存放区地址} CANDIDATELIST;6、COMPOSITIONFORM 窗口位置、大小信息:typedef tagCOMPOSITIONFORM { DWORD dwStyle; //管理窗口方式POINT ptCurrentPos; //给定坐标RECT rcArea; }COMPOSITIONFORM;7、CANDIDATEFORM 列表窗口信息typedef tagCANDIDATEFORM { DWORD dwIndex; //列表窗口序号DWORD dwStyle; //属性:POINT ptCurrentPos; //坐标位置REC rcArea; } CANDIDATEFORM;12、INPUTCONTEXT IMC 数据存放区typedef struct tagINPUTCONTEXT { 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 hGuideLineHIMCC hPrivate; DWORD dwNumMsgBuf; //存放在hMsgBuf中的消息数HIMCC hMsgBuf; //存放的消息DWORD fdwInit //系统根据此值来初始本结构相应的信息DWORD dwReserve[3]; //未定义} INPUTCONTEXT;
IMETool 已经推出有几年了,因为我一向比较懒,没有写过必要的说明,至今有许多朋友不能正确使用它功能(看起来是我设计得比较烂,让人看不明白 )。下面我就几个常见问题做些说明。 1、问:Windows 系统本身就自带输入法管理功能,要 IMETool 何用? 答: ⑴系统自带输入法管理功能无法调整各输入法顺序,而 IMETool 可以实时调整。 ⑵系统自带输入法管理功能只能设置 Ctrl + Alt + 1 之类有限的热键,且有时无法恢复初始设置,删除输入法时无法自动将其热键一并删除。IMETool 大大突破了热键设置局限性,可以实现 1092 种不同的热键组合。这是 IMETool 独一无二的功能。 ⑶系统自带输入法管理功能没有从注册表删除输入法功能。 ⑷另外 IMETool 还支持丰富的命令行参数和脚本,可以通过命令行完成图形界面中的所有功能,非常灵活方便。 2、问:启动系统后总是会默认打开某一输入法,如何才能将其关闭? 答:在 IMETool 的输入法列表中,处在第一位的输入法即为默认输入法。如图一中①处,将“中文 (简体) – 美式键盘”设在第一位,系统启动时就不会再自动打开某输入法了。 3、问:如何才能用一个热键(如 Ctrl + 空格)快速地打开/关闭我最常用的输入法? 答:大家知道,默认的打开/关闭输入法热键是“Ctrl + 空格”,它其实就是来回切换位于输入法列表中前两位的输入法。所以只须将最常用的输入法排在列表中第二位即可,比如我最常用极点五笔输入法,就将其放在图一中②处。 4、问:如何快速打开某输入法的属性或热键对话框? 答:在输入法列表“名称”一列上双击,即可快速打开输入法属性设置对话框;即热键一列双击则打开热键设置对话框。 5、问:“键盘”按钮有何作用? 答:此功能极少用到。一些中文输入法在安装后使用系统默认的英文键盘定义,对于使用其它国别键盘的用户,会产生键位错误的情况。此时可使用 IMETool 的键盘布局重定义功能将其设置为正确的国别即可。注意:在点击“键盘”按钮打开的对话框中选择“确定”后,会立即修改注册表中的相应项目,请谨慎使用。 6、问:输入法风格中的“输入法指示器”和“高级文字服务”有什么区别? 答:在 Office XP 未出现之前,Win 9X 和 Windows 2000 中一直使用输入法指示器(internat.exe),即在任务栏系统托盘区中显示输入法列表的蓝色 En 或 CH 图标(不同配色方案下图标颜色可能不同)。 从 Office XP 开始,微软使用高级文字服务(ctfmon.exe)来代替输入法指示器,其特点是其输入法列表可在屏幕上任意移动,并可缩小至任务栏(但不在系统托盘区)。在 Windows XP/2003 系统中已经用高级文字服务完全取代了输入法指示器,所以要想使用输入法指示器,只能从 Windows 2000 系统中复制出 Internat.exe 和 indicdll.dll(前者必须的库文件)来使用。 7、问:调整输入法顺序为何有时不起作用? 答:此功能主要适用于使用输入法指示器的情况,在高级文字服务模式下,系统往往会记住你上次使用的输入法,并动态调整。另外在 Win95/NT 系统下,调整顺序需要重启系统方可生效。 8、问:使用 IMETool 进行一些设置后,默认的 Ctrl + Shift 切换输入法热键不能用了? 答:这是反映最多的一个问题,在此详细说明一下。 在高级文字服务模式下(ctfmon.exe),有“切换输入语言”和“切换键盘布局”两种热键,两者的热键必须为Ctrl + Shift 和 Alt + Shift 中的一个,即如果前者的热键是 Ctrl + Shift,后者的热键就必须是 Alt + Shift,其设置保存在注册表中。“切换输入语言”是指即在安装的不同语言间切换,如中文(中国)、美国英语等。“切换键盘布局”是指切换不同的输入法。 而在输入法指示器模式下(internat.exe),只有切换输入法这一种功能,而其从注册表读取的热键配置正好是高级文字服务模式下的“切换输入语言”的配置。由此可知,同样的注册表配置,高级文字服务和输入法指示器两种模式下切换输入法的热键正好是 相反的。 所以这个问题并不是 Ctrl + Shift 热键不能用了,而是默认变成了 Alt + Shift,可在设置中改回。 注:在 2.6.5 版本中,已经解决了这个问题,无须再手工切换。 9、问:在使用 IMETool 后,有时输入法的指示条会消失。 答:在 IMETool 的其它设置中,有一个打开/关闭输入法指示条的选项,是调用了一个 API 函数来实现的。不知何故,其只对当前打开的输入法有效,对其它输入法可能会起到相反的作用,不过在系统重启后会恢复正常。此问题有待于以后研究解决。 建议:在使用 IMETool 之前,关闭所有打开的输入法,因为已运行的不同程序下可能会打开不同的输入法,所以要逐个关闭。 10、问:IMETool 的修复功能有哪些,为何在界面中找不到? 答:IMETool 可以修复一些常见的输入法混乱情况:如: ⑴某输入法已经卸载,但仍在输入法列表中残留了条目。 ⑵某输入法已经卸载,但其先前设置的热键并没有取消。 ⑶高级文字服务模式下,将输入法列表条最小化后,任务栏上不出现语言栏。 ⑷2000/XP 提示“检测到不兼容的键盘驱动程序。该对话框已被停用。”,并且无法通过控制面板添加删除输入法。 以上修复过程完全是自动进行的,不需要人工干预,故没有在界面中设计。 11、问:软件包里附带的 internat.exe 和 indicdll.dll 文件有何作用? 答:这两个文件是从Windows 2000 简体中文专业版中提取的,并做过一些修改。Windows XP/2003 若想使用“输入法指示器”风格工作时需要将这两个文件复制到系统文件夹下使用。建议将 imetool.exe 文件也复制到系统文件夹下,这样就可以从输入法指示器右键属性中直接调用 IMETool 了。 12、问:如何卸载 IMETool? 答:IMETool 只有一个主文件,无须安装,自然也无须卸载,直接删除即可。 13、问:一些杀毒软件报 imetool.exe 为“病毒”。 答:IMETool 使用 upx 压缩过,一些比较敏感的杀毒软件会报其为加壳程序(注意不是报病毒!),从 2.8.1 版开始,不再使用 upx 压缩主程序。 Silence 2009.8.14
声明:IMETool 为免费软件,非商业使用无须授权,但不得对软件本身做任何修改。允许个人开发的免费输入法软件将其加入安装包使用,但安装包内不得包含有广告插件或流氓软件。 IME TOOL 支持中英文界面,适用于 Win98/ME/2000/XP/2003 操作系统,部分兼容 Windows 7。 主要功能: 一、动态调整输入法顺序而无须重启。 二、切换输入法指示器和高级文字服务方式。 三、任意设置输入法热键 Windows 本身的输入法热键设置功能限制很多,2000/XP 下更是如此,你不得不设置 ctrl+shift+3 这样的三键热键。IME Tool 让你可以自由地设置各种热键,基本键(ctrl、alt、shift)共有六种组合,辅助键有 91 个可选,如用左 Alt+左 Window 键激活龙文五笔,shift+down 激活紫光拼音。当然,有些热键组合是不能用的,如 shift+数字字母键。 四、注册表错误项目修正 1、自动删除输入法列表中不存在的输入法项目,位置: HKEY_CURRENT_USER\Keyboard Layout\preload 2、检查注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts 下的内容,如果某分支对应的输入法文件不存在,则删除此分支(需要管理员权限)。 3、自动删除输入法从列表中删除后可能遗留的激活热键设置,位置: HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys 五、输入法键盘定义功能,适用于非英文键盘(需要管理员权限)。 六、安装删除输入法 IME TOOL 可以安装标准格式的输入法。自行复制 ime 和 mb 文件到系统目录中,然后使用 imetool 的安装输入法功能指定输入法名称和 ime 文件即可。 IME TOOL 可以从注册表中删除不需要的输入法,但并不删除文件。 七、其它功能 打开输入法属性、打开关闭输入法状态条等。支持命令行参数,支持运行脚本。 另外修正了老版本存在的一些小 bug。 局限: 1、在 Win9x 下设置的输入法热键不能立即生效,必须重启。在 Win95/NT 系统下有更多的功能限制。 注意: 1、用 IME Tool 设置的一些热键在 Windows 本身的输入法设置中会无法正确显示,但不影响使用。 2、繁体、韩文、日文系统下的打开关闭输入法等切换键设置在注册表中的位置不同,因条件所限我没有做进一步测试功能是否有效。 3、在 IME Tool 中刚添加的输入法不能立即设置属性。 4、如果使用输入法指示器方式时,在系统目录下未发现 internat.exe 和 indicdll.dll 文件,将会自动复制当前目录下的此二文件过去(如果存在)。 命令行参数说明: /? /h /help 显示此帮助 /on 启用 internat.exe 或 ctfmon.exe /off 禁用 internat.exe 或 ctfmon.exe /internat 输入法指示器风格 /ctfmon 高级文字服务风格 /status: : 关闭输入法状态条,: 显示输入法状态条 /caps 用 Caps 键关闭大写 /shift 用 Shift 键关闭大写 /switch: : 不使用切换语言和切换键盘布局热键 : 仅使用切换语言热键 : 仅使用切换键盘布局热键 : 同时使用切换语言和切换键盘布局热键 : 切换语言热键使用Ctrl+Shift : 切换键盘布局热键使用Ctrl+Shift /hotkey:,[hotkey] 指定输入法热键 ,指定第1、2、3.. 个输入法的热键 指定打开/关闭输入法的热键 指定全角/半角切换的热键 指定中英文标点切换的热键 如果留空则删除热键 [hotkey] 热键值,如:ctrl+space /add1:,[hotkey] 按名称添加输入法到列表 /add2:,[hotkey] 按文件名添加输入法到列表 /add3:,[hotkey] 按 ID 添加输入法到列表 /del1: 按顺序从列表中删除输入法 /del2: 按名称从列表中删除输入法 /del3:<filen
win10输入法设置工具是一款专业好用的输入法设置软件。 win10输入法设置工具安装方法 双击运行程序,默认安装目录是X:Program Files (x86)win10输入法设置工具,若需更改请点击浏览按钮,选择安装到的磁盘目录。然后点击右下角的安装,即可安装成功。 win10输入法设置工具使用方法 双击桌面的win10输入法设置工具运行主程序,可以看到有三大设置项。 一、设置默认中英文输入法 意思就是系统默认使用中文还是英文输入法,WINXP、WIN7系统默认是英文,WIN10系统默认是中文输入法,觉得不方便朋友可以点击 把英文输入法设为默认 即可。在这里我也建议大家把英文输入法设置为默认,符合使用以往的习惯哦。 二、设置多个输入法切换的快捷键 这个意思就是系统中安装了多个中文输入法,例如搜狗输入法,微软拼音输入法,微软五笔输入法等等输入法切换时候用什么快捷键来切换。通常大家的使用习惯是 ctrl shift 来且切换各个中文输入法。 三、设置输入法与非输入法切换的快捷键 这个意思是设置输入法和非输入法(也就是输入英文的状态),例如当前系统是微软五笔输入法,按ctrl 空格后会切换为英文输入状态。这个主要用途就是中文输入法和非中文输入状态切换。建议使用ctrl 空格吧,符合大家的使用习惯。 win10输入法设置工具截图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值