用VC++自制王码五笔输入法安装包 : Windows XP没有自带五笔字型输入法,虽然网上相关输入法很多,但一方面有些版本是共享软件,另一方面也许很多五笔字型输入法的老用户最习惯用的还是老牌的“王码五笔字型输入法86/98版”。
微软Office XP中包含了王码五笔,但如果仅仅是为了使用它而运行Office XP安装程序,就显得有些小题大做了,更不用说是某些临时在外面用公用电脑而又想用五笔字型输入法的情况。于是网上出现了很多简化安装方法,大体可分为三个步骤:
1.拷贝输入法文件(从Office XP光盘中或已经安装了“王码五笔字型输入法”的电脑中提取)
2.增加注册表项
3.重启后通过控制面板添加输入法
整个过程中拷贝输入法文件和增加注册表项可以用批处理和导入注册表文件来简化操作,但必须重启电脑才能在控制面板里添加输入法,这同样让使用者觉得比较烦琐。作为编程爱好者能不能通过写个小程序实现在不重启全自动安装“王码五笔字型输入法”呢(也就是即装即用)?答案是肯定的!因为Office XP安装程序做到了,这就表示微软肯定留有一个专门用来安装输入法的接口,一般来说应该是一系列API函数。
经过一番摸索,笔者在MSDN里找到了这个可以用来安装输入法的API:ImmInstallIME()。OK,现在就开始利用它实现自己的“王码五笔字型输入法”全自动安装程序。
一、准备素材
先试着从Office XP光盘中提取“王码五笔字型输入法”的输入法文件。通过Windows查找功能第一张安装盘中查找与“WINWB”相关的文件,在OFFICE1.CAB中找到以下14个文件:WINWB86.CHM.*、WINWB86.CNT.*、WINWB86.HLP.*、WINWB86A.IME.*、WINWB86A.MB.*、WINWB86W.IME.*、WINWB86W.MB.*、WINWB98.CHM.*、WINWB98.CNT.*、WINWB98.HLP.*、WINWB98A.IME.*、WINWB98A.MB.*、WINWB98W.IME.*、WINWB98W.MB.*,其中*是很长的一串由字母、数字和下滑线组成的序列(个人认为应该是微软为校验文件内容正确性而加上的为该文件校验码的后缀)。去掉这个长长的后缀,可以看到5种类型的文件。很明显,*.CHM、*.CNT和*.HLP是输入法帮助文件,*.MB是码表文件,*.IME是输入法主文件。其中*.IME和*.MB有文件名部分以A结尾和以W结尾两个版本,经过试验证实了它们分别是ANSI和UNICODE两种版本的输入法文件。文件名部分以A结尾的文件适用于Windows 9x,以W结尾的文件适用于NT系列Windows。
提取了输入法文件后必须让安装程序针对不同版本操作系统将它们拷贝到正确的目录,以便调用API来进行输入法安装。笔者分别在安装了Office XP中自带的“王码五笔字型输入法”的Windows 98SE和Windows XP中查找以上文件,发现帮助文件都存放在WindowsHELP目录中(这里假设系统安装在Windows目录)。而主要的输入法文件(*.IME)和码表文件(*.MB)在Windows 9x下存放于WindowsSYSTEM目录中,在NT系列Windows系统中存放于WindowsSYSTEM32目录中。
二、相关API函数
素材准备工作已经完成,现在来看一下代码编写过程中需要用到的4个主要的API函数。
1.DWORD GetVersion(VOID)
该函数返回与当前使用的Windows系统版本有关的信息。可通过判断返回值最高位是否为1来判断当前是用的系统是NT/2000/XP还是9x/ME。
2.BOOL CopyFile(LPCTSTR lpExistFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);
该函数将以lpExistFileName指向的字符串为文件名的文件复制为以lpNewFileName指向的字符串为文件名的新文件。这里的文件名可以包含文件路径。最后的参数bFailIfExists决定当新文件已存在时是否覆盖现有文件,如果为FALSE,则覆盖。
3.HKL ImmInstallIME(LPCTSTR lpszIMEFileName, LPCTSTR lpszLayoutText);
这是制作“王码五笔字型输入法”全自动安装程序的关键函数。函数两个参数分别为输入法IME文件的文件名和在控制面板的是输入法选项中显示的输入法名称。函数调用后将返回一个被安装输入法的输入法标识符(或称做输入法句柄)。
4.BOOL ImmIsIME(HKL hKL);
该函数判断hKL指向的输入法是否有效。可以用ImmInstallIME函数的返回值作为该函数参数,通过函数返回值来判断输入法是否安装成功。
微软Office XP中包含了王码五笔,但如果仅仅是为了使用它而运行Office XP安装程序,就显得有些小题大做了,更不用说是某些临时在外面用公用电脑而又想用五笔字型输入法的情况。于是网上出现了很多简化安装方法,大体可分为三个步骤:
1.拷贝输入法文件(从Office XP光盘中或已经安装了“王码五笔字型输入法”的电脑中提取)
2.增加注册表项
3.重启后通过控制面板添加输入法
整个过程中拷贝输入法文件和增加注册表项可以用批处理和导入注册表文件来简化操作,但必须重启电脑才能在控制面板里添加输入法,这同样让使用者觉得比较烦琐。作为编程爱好者能不能通过写个小程序实现在不重启全自动安装“王码五笔字型输入法”呢(也就是即装即用)?答案是肯定的!因为Office XP安装程序做到了,这就表示微软肯定留有一个专门用来安装输入法的接口,一般来说应该是一系列API函数。
经过一番摸索,笔者在MSDN里找到了这个可以用来安装输入法的API:ImmInstallIME()。OK,现在就开始利用它实现自己的“王码五笔字型输入法”全自动安装程序。
一、准备素材
先试着从Office XP光盘中提取“王码五笔字型输入法”的输入法文件。通过Windows查找功能第一张安装盘中查找与“WINWB”相关的文件,在OFFICE1.CAB中找到以下14个文件:WINWB86.CHM.*、WINWB86.CNT.*、WINWB86.HLP.*、WINWB86A.IME.*、WINWB86A.MB.*、WINWB86W.IME.*、WINWB86W.MB.*、WINWB98.CHM.*、WINWB98.CNT.*、WINWB98.HLP.*、WINWB98A.IME.*、WINWB98A.MB.*、WINWB98W.IME.*、WINWB98W.MB.*,其中*是很长的一串由字母、数字和下滑线组成的序列(个人认为应该是微软为校验文件内容正确性而加上的为该文件校验码的后缀)。去掉这个长长的后缀,可以看到5种类型的文件。很明显,*.CHM、*.CNT和*.HLP是输入法帮助文件,*.MB是码表文件,*.IME是输入法主文件。其中*.IME和*.MB有文件名部分以A结尾和以W结尾两个版本,经过试验证实了它们分别是ANSI和UNICODE两种版本的输入法文件。文件名部分以A结尾的文件适用于Windows 9x,以W结尾的文件适用于NT系列Windows。
提取了输入法文件后必须让安装程序针对不同版本操作系统将它们拷贝到正确的目录,以便调用API来进行输入法安装。笔者分别在安装了Office XP中自带的“王码五笔字型输入法”的Windows 98SE和Windows XP中查找以上文件,发现帮助文件都存放在WindowsHELP目录中(这里假设系统安装在Windows目录)。而主要的输入法文件(*.IME)和码表文件(*.MB)在Windows 9x下存放于WindowsSYSTEM目录中,在NT系列Windows系统中存放于WindowsSYSTEM32目录中。
二、相关API函数
素材准备工作已经完成,现在来看一下代码编写过程中需要用到的4个主要的API函数。
1.DWORD GetVersion(VOID)
该函数返回与当前使用的Windows系统版本有关的信息。可通过判断返回值最高位是否为1来判断当前是用的系统是NT/2000/XP还是9x/ME。
2.BOOL CopyFile(LPCTSTR lpExistFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);
该函数将以lpExistFileName指向的字符串为文件名的文件复制为以lpNewFileName指向的字符串为文件名的新文件。这里的文件名可以包含文件路径。最后的参数bFailIfExists决定当新文件已存在时是否覆盖现有文件,如果为FALSE,则覆盖。
3.HKL ImmInstallIME(LPCTSTR lpszIMEFileName, LPCTSTR lpszLayoutText);
这是制作“王码五笔字型输入法”全自动安装程序的关键函数。函数两个参数分别为输入法IME文件的文件名和在控制面板的是输入法选项中显示的输入法名称。函数调用后将返回一个被安装输入法的输入法标识符(或称做输入法句柄)。
4.BOOL ImmIsIME(HKL hKL);
该函数判断hKL指向的输入法是否有效。可以用ImmInstallIME函数的返回值作为该函数参数,通过函数返回值来判断输入法是否安装成功。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-123216/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10294527/viewspace-123216/