当前位置:文档之家› 常用API函数参数

常用API函数参数

常用API函数参数5ImmIsIME函数功能:判断指定的句柄是否为IME;函数原型:BOOL ImmIsIME( HKL hKL );参数hKL:待检查的键盘布局句柄;返回值:函数调用成功返回1,失败返回0.速查信息:Windows NT: 要求4.0或更高版本Windows: 要求Windows 95 或更高.Windows CE:不支持.Header: 声明在imm.h.Import Library: imm32.lib.Windows XP没有自带五笔型输入法,这对五笔型用户而言无疑是个大大的遗憾。

网上的五笔型输入法虽然种类很多,也不乏优秀的版本,但一方面有些版本是共享软件需要注册,另一方面也许很多五笔型输入法的老用户最习惯用的还是老牌的“王码五笔型输入法86/98版”。

微软的Office XP软件中包含了这个老牌的五笔型输入法,但如果用户并不使用Office XP中的任何组件,仅仅是为了使用“王码五笔型输入法”而运行Office XP安装程序,就显的有些小题大做了,更不用说是某些零时在外面用公用电脑而又想用五笔型输入法的情况。

于是网上出现了很多简化的安装方法,大体上可以分为三个步骤:拷贝输入法文件(从Of还是9x/ME。

示例代码fice XP光盘中或已经安装了“王码五笔型输入法”的电脑中提取)增加注册表项重启后通过控制面板添加输入法整个过程中拷贝输入法文件和增加注册表项可以用批处理和导入注册表文件来简化操作,但必须重启计算机才能在控制面板里添加输入法,这同样让使用者觉得比较烦琐。

那么作为一个编程爱好者能不能通过写个小程序来实现在不重新启动计算机的情况下全自动的安装“王码五笔型输入法”呢(也就是即装即用)?答案是肯定的!因为微软的Office XP 安装程序做到了,这就表示微软肯定留有一个专门用来安装输入法的接口,一般来说应该是一系列API函数。

经过一番摸索,笔者在MSDN里找到了这个可以用来安装输入法的API:ImmInstallIME()。

Ok,现在我们就开始利用这个API来实现自己的“王码五笔型输入法”全自动安装程序。

一、准备素材我们先试着从Office XP光盘中提取“王码五笔型输入法”的输入法文件。

通过Windows 的查找功能在Office XP的第一张安装盘中查找与“WINWB”相关的文件,在OFFICE1.CAB 中找到了一下14个文件:WINWB86.CHM.*、T.*、WINWB86.HLP.*、WINWB86A.IME.*、WINWB86A.MB.*、WINWB86W.IME.*、WINWB86W.MB.*、WINWB98.CHM.*、T.*、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系统都安装在WINDOWS目录)。

而主要的输入法文件(*.IME)和码表文件(*.MB)在Windows 9x下存放于WINDOWSSYSTEM目录中,在NT系列Windows系统中存放于WINDOWSSYSTEM32目录中。

二、相关API函数素材的准备工作已经完成,现在我们来看一下代码编写过程中需要用到的4个主要的API函数。

2.1 GetVersion函数原型:DWORD GetVersion(VOID);该函数返回与当前使用的Windows系统版本有关的信息。

可以通过判断返回值最高位是否为1来判断当前是用的系统是NT/2000/XP还是9x/ME。

示例代码:if (GetVersion() < 0x80000000)//NT/2000/XPelse//9x/ME2.2 CopyFile函数原型:BOOL CopyFile(LPCTSTR lpExistFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);该函数将以lpExistFileName指向的字符串为文件名的文件复制为以lpNewFileName 指向的字符串为文件名的新文件。

这里的文件名可以包含文件路径。

最后的参数bFailIfExists决定当新文件已存在时是否覆盖现有文件,如果为FALSE,则覆盖。

示例代码:CopyFile("c:a.txt", "d: .txt", FALSE);以上代码将c盘下的a.txt文件复制到D盘下并命名为b.txt。

如果已经存在b.txt,则覆盖原来的文件。

2.3 ImmInstallIME函数原型:HKL ImmInstallIME(LPCTSTR lpszIMEFileName, LPCTSTR lpszLayoutText);这是制作“王码五笔型输入法”全自动安装程序的关键函数。

函数的两个参数分别为输入法IME文件的文件名和在控制面板的是输入法选项中显示的输入法名称。

函数调用后将返回一个被安装输入法的输入法标识符(或称做输入法句柄)。

示例代码:HKL hKL = ImmInstallIME("c:winwb86.ime", "王码五笔型输入法86版");以上代码将输入法文件c:winwb86.ime安装到系统中,并命名为“王码五笔型输入法86版”。

函数调用后返回安装的输入法的标识符,存放在hKL变量中。

2.4 ImmIsIME函数原型:BOOL ImmIsIME(HKL hKL);该函数判断hKL指向的输入法是否有效。

我们可以用ImmInstallIME函数的返回值作为该函数参数,通过函数返回值来判断输入法是否安装成功。

示例代码:if (ImmIsIME(hKL))//安装输入法成功else//安装失败hKL为调用ImmInstallIME()后得到的输入法标识符。

三、创建工程并添加代码1. 打开Visual C++ 6.0,通过菜单File - New新建一个名为“WINWB”的“Win32 Application”工程(如图1),单击“OK”。

2. 在应用程序类型选择中选择“An empty project”(图2),单击“Finsish”。

这样我们就新建好了一个空的Win32应用程序工程。

3. 通过菜单Project - Add to Project - New添加一个“Resource Script”资源文件,命名为“WINWB”(如图3)。

4. 通过菜单Insert - Resource添加一个新的Dialog资源(如图4)。

5. 调整Dialog资源的若干属性。

在Dialog的任意空白区域双击鼠标左键打开属性对话框,在属性对话框的Gerneral选项卡中更改ID为“IDD_MAIN”、 Caption属性为“王码五笔型输入法安装程序”(如图5)。

单击Font按钮,更改字体为宋体9号(这是简体中文版XP的标准字体型号)。

单击More Styles选项卡,选中Center属性,使对话框能在屏幕中居中显示(如图6)。

6. 关闭属性对话框,回到资源编辑界面。

删掉系统自动添加的“Cancel”按钮并更改“OK”按钮的Caption属性为“安装”(如图7)。

7. 添加一个新的Static Text控件,打开属性对话框更改Caption属性为“请选择输入法版本:”(如图8)。

8.添加一个新的List Box控件,打开属性对话框更改ID为“IDC_LIST”(如图9):并更改它的Selection属性为“Multiple”(如图10)。

9. 适当调整控件的大小和位置,完成资源创建(如图11):10. 通过菜单Project - Add to Project - New添加一个“C++ Source File”代码文件,命名为“WINWB”(如图12):11. 在新添加“WINWB.CPP”文件中输入程序代码,代码如下:#include <windows.h>#include "resource.h"#pragma comment(lib, "imm32.lib")#define IME_WINWB86 0#define IME_WINWB98 1BOOL CALLBACK Main_DlgProc(HWND, UINT, WPARAM, LPARAM); LPCTSTR TranslateFileName(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;}//// 函数名:Main_DlgProc//// 参数:hDlg - 对话框句柄// uMsg - 消息值// wParam、lParam - 消息参数//// 返回值:TRUE - 消息已处理// FALSE - 消息未处理,返回给默认对话框处理程序处理//// 备注:对话框IDD_MAIN的回调函数//BOOL CALLBACK Main_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){TCHAR strWINWB86[] = "王码五笔型输入法86版";TCHAR strWINWB98[] = "王码五笔型输入法98版";TCHAR cBuf[30]; // 存放LISTBOX中ITEM文本的缓冲区int nBuf[2]; // 存放LISTBOX中被选中的ITEM索引号的缓冲区int nSel; // LISTBOX中被选种的ITEM的数目switch (uMsg){case WM_INITDIALOG:// 初始化LISTBOXSendDlgItemMessage(hDlg, IDC_LIST, LB_ADDSTRING, 0, (LPARAM)strWINWB86);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)nBuf);if (nSel == 0){MessageBox(hDlg, "请选择输入法版本!", "提示信息", MB_OK);return TRUE;}for (-- nSel; nSel >= 0; nSel --){// 获取LISTBOX中该索引号对应的ITEM的文本SendDlgItemMessage(hDlg, IDC_LIST, LB_GETTEXT, nBuf[nSel], (LPARAM)cBuf);if (lstrcmp(cBuf, strWINWB86) == 0){InstallIME(IME_WINWB86); // 安装王码五笔型输入法86版 }else if (lstrcmp(cBuf, strWINWB98) == 0){InstallIME(IME_WINWB98); // 安装王码五笔型输入法98版 }}return TRUE;}default:return FALSE;}}TCHAR g_strFileName[MAX_PATH]; // 函数TranslateFileName用到的字符串缓冲区//// 函数名:TranslateFileName//// 参数:lpszFileName - 指向用相对路径表示的文件名的字符串指针//// 返回值:指向用绝对路径表示的文件名的字符串指针//// 备注:将以WINDOWS目录为基准的用相对路径表示的文件名转换成用绝对路径表示的文件名//LPCTSTR TranslateFileName(LPCTSTR lpszFileName){// 获取WINDOWS目录的路径GetWindowsDirectory(g_strFileName, MAX_PATH);// 如果WINDOWS目录的路径是根目录if (g_strFileName[lstrlen(g_strFileName)-1] == ''){// 去掉路径最后的“”g_strFileName[lstrlen(g_strFileName)-1] = '';}// 连接WINDOWS目录路径和用相对路径表示的文件名lstrcat(g_strFileName, lpszFileName);return g_strFileName;}//// 函数名:InstallIME//// 参数:nIMEType - 输入法类型//// 返回值:无//// 备注:安装指定的输入法//void InstallIME(int nIMEType){TCHAR strWINWB86A[] = "王码五笔型86版";TCHAR strWINWB86W[] = "中文 (简体) - 王码五笔型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);CopyFile("T", TranslateFileName("T"), FALSE);if (GetVersion() < 0x80000000) // NT/2000/XP系统{// 复制UNICODE版输入法文件CopyFile("WINWB86W.IME",TranslateFileName("SYSTEM32WINWB86.IME"), FALSE);CopyFile("WINWB86W.MB",TranslateFileName("SYSTEM32WINWB86.MB"), FALSE);// 安装UNICODE版输入法hKL = 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("SYSTEMWINWB86.IME"), strWINWB86A);}// 验证输入法句柄是否有效if (ImmIsIME(hKL)){MessageBox(NULL, "安装王码五笔型输入法86版成功!", "提示信息", MB_OK);}else{MessageBox(NULL, "安装王码五笔型输入法86版失败!", "提示信息", MB_OK);}}else if (nIMEType == IME_WINWB98){CopyFile("WINWB98.HLP", TranslateFileName("HELPWINWB98.HLP"), FALSE);CopyFile("WINWB98.CHM", TranslateFileName("HELPWINWB98.CHM"), FALSE);CopyFile("T", TranslateFileName("T"), FALSE);if (GetVersion() < 0x80000000){CopyFile("WINWB98W.IME",TranslateFileName("SYSTEM32WINWB98.IME"), FALSE);CopyFile("WINWB98W.MB",TranslateFileName("SYSTEM32WINWB98.MB"), FALSE);hKL = ImmInstallIME(TranslateFileName("SYSTEM32WINWB98.IME"), strWINWB98W);}else{CopyFile("WINWB98A.IME",TranslateFileName("SYSTEMWINWB98.IME"), FALSE);CopyFile("WINWB98A.MB", TranslateFileName("SYSTEMWINWB98.MB"), FALSE);hKL = ImmInstallIME(TranslateFileName("SYSTEMWINWB98.IME"), strWINWB98A);}if (ImmIsIME(hKL)){MessageBox(NULL, "安装王码五笔型输入法98版成功!", "提示信息", MB_OK);}else{MessageBox(NULL, "安装王码五笔型输入法98版失败!", "提示信息", MB_OK);}}}四、制作安装包在菜单Build - Set Active Configuration设置工程配置为“Win32 – Release”,然后进行编译、连接。

相关主题