1、自制王码五笔字型输入法安装包喜欢玩软件的朋友一定经常遇到 RePack 的软件。所谓 RePack,一般是针对原有软件不足进行优化(比如汉化、打补丁、增加插件等 )并重新打包成安装程序,使用起来更加顺手。究竟 RePack 是如何进行呢?这次就请北京的张伟朋友给大家演示一下。此外,限于版面本文插图略有删改,完整文章电子版及最终王码五笔字型输入法安装包可在http:/ 下载。非常适合喜欢 Visual C+朋友按部就班,跟着文章一步步操作。Windows XP 没有自带五笔字型输入法,虽然网上相关输入法很多,但一方面有些版本是共享软件,另一方面也许很多五笔字型输入法的老用户最习惯用的还是老牌的“
2、王码五笔字型输入法 86/98 版” 。微软 Office XP 中包含了王码五笔,但如果仅仅是为了使用它而运行 Office XP 安装程序,就显得有些小题大做了,更不用说是某些临时在外面用公用电脑而又想用五笔字型输入法的情况。于是网上出现了很多简化安装方法,大体可分为三个步骤:1.拷贝输入法文件(从 Office XP 光盘中或已经安装了“王码五笔字型输入法”的电脑中提取)2.增加注册表项3.重启后通过控制面板添加输入法整个过程中拷贝输入法文件和增加注册表项可以用批处理和导入注册表文件来简化操作,但必须重启电脑才能在控制面板里添加输入法,这同样让使用者觉得比较烦琐。作为编程爱好者能不能通过
3、写个小程序实现在不重启全自动安装“王码五笔字型输入法”呢( 也就是即装即用)?答案是肯定的!因为 Office XP 安装程序做到了,这就表示微软肯定留有一个专门用来安装输入法的接口,一般来说应该是一系列 API 函数。经过一番摸索,笔者在 MSDN 里找到了这个可以用来安装输入法的 API:ImmInstallIME()。OK,现在就开始利用它实现自己的“王码五笔字型输入法”全自动安装程序。一、准备素材先试着从 Office XP 光盘中提取“王码五笔字型输入法”的输入法文件。通过 Windows 查找功能第一张安装盘中查找与“WINWB”相关的文件,在 OFFICE1.CAB 中找到以下
4、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 种类型的文件。很明显,*.
5、CHM、*.CNT 和*.HLP 是输入法帮助文件,*.MB 是码表文件,*.IME 是输入法主文件。其中 *.IME 和*.MB 有文件名部分以 A 结尾和以 W 结尾两个版本,经过试验证实了它们分别是 ANSI 和 UNICODE 两种版本的输入法文件。文件名部分以 A 结尾的文件适用于 Windows 9x,以 W 结尾的文件适用于 NT 系列 Windows。提取了输入法文件后必须让安装程序针对不同版本操作系统将它们拷贝到正确的目录,以便调用 API 来进行输入法安装。笔者分别在安装了 Office XP 中自带的“王码五笔字型输入法”的 Windows 98SE 和 Windows
6、XP 中查找以上文件,发现帮助文件都存放在WindowsHELP 目录中(这里假设系统安装在 Windows 目录) 。而主要的输入法文件(*.IME)和码表文件(*.MB)在 Windows 9x 下存放于WindowsSYSTEM 目录中,在 NT 系列Windows 系统中存放于WindowsSYSTEM32 目录中。二、相关 API 函数素材准备工作已经完成,现在来看一下代码编写过程中需要用到的 4 个主要的 API 函数。1.DWORD GetVersion(VOID)该函数返回与当前使用的 Windows 系统版本有关的信息。可通过判断返回值最高位是否为1 来判断当前是用的系统是
7、NT/2000/XP 还是 9x/ME。2.BOOL CopyFile(LPCTSTR lpExistFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);该函数将以 lpExistFileName 指向的字符串为文件名的文件复制为以 lpNewFileName 指向的字符串为文件名的新文件。这里的文件名可以包含文件路径。最后的参数 bFailIfExists 决定当新文件已存在时是否覆盖现有文件,如果为 FALSE,则覆盖。3.HKL ImmInstallIME(LPCTSTR lpszIMEFileName, LPCTSTR lpszLa
8、youtText);这是制作“王码五笔字型输入法”全自动安装程序的关键函数。函数两个参数分别为输入法IME 文件的文件名和在控制面板的是输入法选项中显示的输入法名称。函数调用后将返回一个被安装输入法的输入法标识符(或称做输入法句柄) 。4.BOOL ImmIsIME(HKL hKL);该函数判断 hKL 指向的输入法是否有效。可以用 ImmInstallIME 函数的返回值作为该函数参数,通过函数返回值来判断输入法是否安装成功。三、创建工程并添加代码1.打开 Visual C+ 6.0,通过菜单“FileNew”新建名为“WINWB”的“Win32 Application”工程,单击“OK”。
9、2.在应用程序类型选择中选择“An empty project”,单击“Finsish”。这样我们就新建好了一个空的 Win32 应用程序工程。3.通过菜单“ProjectAdd to ProjectNew”添加一个“Resource Script”资源文件,命名为“WINWB”。4.通过菜单“InsertResource”添加一个新的 Dialog 资源。5.调整 Dialog 资源的若干属性。在 Dialog 的任意空白区域双击鼠标左键打开属性对话框,在属性对话框的 Gerneral 选项卡中更改 ID 为“IDD_MAIN”、 Caption 属性为“ 王码五笔字型输入法安装程序”。单击
10、 Font 按钮,更改字体为宋体 9 号(这是简体中文版 XP 的标准字体型号)。单击 More Styles 选项卡,选中 Center 属性,使对话框能在屏幕中居中显示。6.关闭属性对话框,回到资源编辑界面。删掉系统自动添加的“Cancel”按钮并更改“OK” 按钮的 Caption 属性为“ 安装” 。7.添加一个新的 Static Text 控件,打开属性对话框更改 Caption 属性为“请选择输入法版本:”。8.添加一个新的 List Box 控件,打开属性对话框更改 ID 为 “IDC_LIST”,并更改它的Selection 属性为“Multiple”。9.适当调整控件的大小和
11、位置,完成资源创建(见图 1)。10.通过菜单“ProjectAdd to ProjectNew” 添加一个“C+ Source File”代码文件,命名为“WINWB”。11.在新添加“WINWB.CPP”文件中输入程序代码,代码如下 :#include #include “resource.h“#pragma comment(lib, “imm32.lib“)#define IME_WINWB86 0#define IME_WINWB98 1BOOL CALLBACK Main_DlgProc(HWND, UINT, WPARAM, LPARAM);LPCTSTR TranslateFil
12、eName(LPCTSTR);void InstallIME(int); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)DialogBox(hInstance, (LPCTSTR)IDD_MAIN, NULL, Main_DlgProc);return 0;/ 对话框 IDD_MAIN 的回调函数BOOL CALLBACK Main_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)TCHA
13、R strWINWB86 = “王码五笔字型输入法 86 版“;TCHAR strWINWB98 = “王码五笔字型输入法 98 版“;TCHAR cBuf30; / 存放 LISTBOX 中 ITEM 文本的缓冲区int nBuf2; / 存放 LISTBOX 中被选中的 ITEM 索引号的缓冲区int nSel; / LISTBOX 中被选种的 ITEM 的数目switch (uMsg)case WM_INITDIALOG:/ 初始化 LISTBOXSendDlgItemMessage(hDlg, IDC_LIST, LB_ADDSTRING, 0, (LPARAM)strWINWB86)
14、;SendDlgItemMessage(hDlg, IDC_LIST, LB_ADDSTRING, 0, (LPARAM)strWINWB98);return TRUE;case WM_COMMAND:switch (LOWORD(wParam)/ 响应“退出”按钮case IDCANCEL:EndDialog(hDlg, 0);return TRUE;/ 响应“添加”按钮case IDOK:/ 获取 LISTBOX 中被选中的 ITEM 的数目及索引号nSel = SendDlgItemMessage(hDlg, IDC_LIST, LB_GETSELITEMS, 2, (LPARAM)nB
15、uf);if (nSel = 0)MessageBox(hDlg, “请选择输入法版本!“, “提示信息 “, MB_OK);return TRUE;for (- nSel; nSel = 0; nSel -)/ 获取 LISTBOX 中该索引号对应的 ITEM 的文本SendDlgItemMessage(hDlg, IDC_LIST, LB_GETTEXT, nBufnSel, (LPARAM)cBuf);if (lstrcmp(cBuf, strWINWB86) = 0)InstallIME(IME_WINWB86); / 安装王码五笔字型输入法 86 版else if (lstrcmp(
16、cBuf, strWINWB98) = 0)InstallIME(IME_WINWB98); / 安装王码五笔字型输入法 98 版return TRUE;default:return FALSE;TCHAR g_strFileNameMAX_PATH; / 函数 TranslateFileName 用到的字符串缓冲区/ 将以 Windows 目录为基准的用相对路径表示的文件名转换成用绝对路径表示的文件名LPCTSTR TranslateFileName(LPCTSTR lpszFileName)/ 获取 Windows 目录的路径GetWindowsDirectory(g_strFileNam
17、e, MAX_PATH);/ 如果 Windows 目录的路径是根目录if (g_strFileNamelstrlen(g_strFileName)-1 = )/ 去掉路径最后的“”g_strFileNamelstrlen(g_strFileName)-1 = 0;/ 连接 Windows 目录路径和用相对路径表示的文件名lstrcat(g_strFileName, lpszFileName);return g_strFileName;/ 安装指定的输入法void InstallIME(int nIMEType)TCHAR strWINWB86A = “王码五笔字型 86 版“;TCHAR s
18、trWINWB86W = “中文 (简体) - 王码五笔字型 86 版“;TCHAR strWINWB98A = “王码五笔字型 98 版“;TCHAR strWINWB98W = “中文 (简体) - 王码五笔字型 98 版“;HKL hKL;if (nIMEType = IME_WINWB86)/ 复制输入法帮助文件CopyFile(“WINWB86.HLP“, TranslateFileName(“HELPWINWB86.HLP“), FALSE);CopyFile(“WINWB86.CHM“, TranslateFileName(“HELPWINWB86.CHM“), FALSE);C
19、opyFile(“WINWB86.CNT“, TranslateFileName(“HELPWINWB86.CNT“), FALSE);if (GetVersion() 0x80000000) / NT/2000/XP 系统/ 复制 UNICODE 版输入法文件CopyFile(“WINWB86W.IME“, TranslateFileName(“SYSTEM32WINWB86.IME“), FALSE);CopyFile(“WINWB86W.MB“, TranslateFileName(“SYSTEM32WINWB86.MB“), FALSE);/ 安装 UNICODE 版输入法hKL =
20、ImmInstallIME(TranslateFileName(“SYSTEM32WINWB86.IME“), strWINWB86W);else / 9X/ME 系统/ 复制 ANSI 版输入法文件CopyFile(“WINWB86A.IME“, TranslateFileName(“SYSTEMWINWB86.IME“), FALSE);CopyFile(“WINWB86A.MB“, TranslateFileName(“SYSTEMWINWB86.MB“), FALSE);/ 安装 ANSI 版输入法hKL = ImmInstallIME(TranslateFileName(“SYSTE
21、MWINWB86.IME“), strWINWB86A);/ 验证输入法句柄是否有效if (ImmIsIME(hKL)MessageBox(NULL, “安装王码五笔字型输入法 86 版成功! “, “提示信息“, MB_OK);elseMessageBox(NULL, “安装王码五笔字型输入法 86 版失败! “, “提示信息“, MB_OK);else if (nIMEType = IME_WINWB98)CopyFile(“WINWB98.HLP“, TranslateFileName(“HELPWINWB98.HLP“), FALSE);CopyFile(“WINWB98.CHM“,
22、TranslateFileName(“HELPWINWB98.CHM“), FALSE);CopyFile(“WINWB98.CNT“, TranslateFileName(“HELPWINWB98.CNT“), FALSE);if (GetVersion() 0x80000000)CopyFile(“WINWB98W.IME“, TranslateFileName(“SYSTEM32WINWB98.IME“), FALSE);CopyFile(“WINWB98W.MB“, TranslateFileName(“SYSTEM32WINWB98.MB“), FALSE);hKL = ImmIns
23、tallIME(TranslateFileName(“SYSTEM32WINWB98.IME“), strWINWB98W);elseCopyFile(“WINWB98A.IME“, TranslateFileName(“SYSTEMWINWB98.IME“), FALSE);CopyFile(“WINWB98A.MB“, TranslateFileName(“SYSTEMWINWB98.MB“), FALSE);hKL = ImmInstallIME(TranslateFileName(“SYSTEMWINWB98.IME“), strWINWB98A);if (ImmIsIME(hKL)M
24、essageBox(NULL, “安装王码五笔字型输入法 98 版成功! “, “提示信息“, MB_OK);elseMessageBox(NULL, “安装王码五笔字型输入法 98 版失败! “, “提示信息“, MB_OK);四、制作安装包在菜单“BuildSet Active Configuration”设置工程配置为 “Win32 Release”,然后进行编译、连接。将编译、连接后生成的可执行文件Releasewinwb.exe 与前面提取出来的 14 个王码五笔字型输入法文件放在同一目录中,我们的王码五笔字型输入法全自动安装程序就完成了。但作为一个小功能程序,需要携带 15 个文件
25、,未免有些不太方便。同时也为了使我们的程序看上去更专业点,我们可以使用一些压缩软件或者安装包制作工具来将它制作成一个单一文件的软件安装包,这样也可以方便携带和使用。这里推荐使用 Windows 2000/XP 自带的一个安装包制作工具IExpress,它采用微软的CAB 压缩文件格式,能生成自解压缩文件,是一款小巧、免费的安装包制作工具。具体制作步骤如下:1.在开始菜单的运行中键入“iexpress”,单击确定打开 IExpress 程序。2.保持默认选项“Create new Self Extraction Directive file”,单击“下一步”继续。3.保持默认选项“Extract
26、 files and run an installation command” ,单击“下一步”继续。4.进入“Package title”界面,在编辑框中输入 “解压缩文件” ,这是将生成的安装包解压缩时出现的对话框的标题栏,可以随意设定。输入完成后单击“下一步”继续。5.保持默认选项“No prompt” ,单击 “下一步”继续。6.保持默认选项“Do not display a license”,单击“下一步”继续。7.进入“Packaged files”界面,单击“Add” 按钮,在打开文件对话框中选中王码五笔字型输入法安装程序的所有 15 个文件,单击“下一步”继续。8.进入“Ins
27、tall Program to”,在“Install Program”下拉式组合框中选中“WINWB.exe”,单击“ 下一步”继续。9.保持默认选项“Default(recommended)”,单击“下一步”继续。10.保持默认选项“No message”,单击“下一步”继续。11.进入“Package Name and Options”界面,单击“Browse” 按钮选择安装包存放位置和文件名。这里仍然使用“WINWB.EXE” 。注意使用这个文件名时不要将安装包放在安装程序所在目录,以免和我们制作的安装程序 WINWB.exe 重名。单击“下一步”继续。12.进入“Configure restart” 界面,选中“No restart”,单击“ 下一步 ”继续。13.进入“Save Self Extraction Directive” 界面,选中“Dont save”,单击“下一步”继续。14.进入“Create package” 界面,单击“下一步”完成设置工作并开始制作安装包。15.单击完成结束安装包制作。现在,王码五笔字型输入法安装包就算制作完成了。本程序在 Windows XP Profession(SP1)简体中文版、Visual Studio 6.0(SP6)英文企业版下调试通过。在 Windows 98 SE 简体中文版下运行通过。