《常用api函数参数5》由会员分享,可在线阅读,更多相关《常用api函数参数5(17页珍藏版)》请在金锄头文库上搜索。
1、常用 API 函数参数 5ImmIsIME函数功能: 判断指定的句柄是否为 IME; 函数原型: B BO OO OL L I Im mm mI Is sI IM ME E( ( H HK KL L hKL ) ); ; 参数 hKL: 待检查的键盘布局句柄; 返回值: 函数调用成功返回 1,失败返回 0. 速查信息: W Wi in nd do ow ws s N NT T: : 要求 4.0 或更高版本 W Wi in nd do ow ws s: : 要要求求 Windows 95 或更高. W Wi in nd do ow ws s C CE E: : 不支持. H He ea ad
2、de er r: : 声明在 imm.h. I Im mp po or rt t L Li ib br ra ar ry y: : imm32.lib.Windows XP 没有自带五笔型输入法,这对五笔型用户而言无疑是个大大的遗憾。网上的五笔型输入法虽然种类很多,也不乏优秀的版本,但一方面有些版本是共享软件需要注册,另一方面也许很多五笔型输入法的老用户最习惯用的还是老牌的“王码五笔型输入法86/98 版”。微软的 Office XP 软件中包含了这个老牌的五笔型输入法,但如果用户并不使用Office XP 中的任何组件,仅仅是为了使用“王码五笔型输入法”而运行 Office XP 安装程序,
3、就显的有些小题大做了,更不用说是某些零时在外面用公用电脑而又想用五笔型输入法的情况。于是网上出现了很多简化的安装方法,大体上可以分为三个步骤:拷贝输入法文件(从 Of 还是 9x/ME。示例代码 fice XP 光盘中或已经安装了“王码五笔型输入法”的电脑中提取)增加注册表项重启后通过控制面板添加输入法整个过程中拷贝输入法文件和增加注册表项可以用批处理和导入注册表文件来简化操作,但必须重启计算机才能在控制面板里添加输入法,这同样让使用者觉得比较烦琐。那么作为一个编程爱好者能不能通过写个小程序来实现在不重新启动计算机的情况下全自动的安装“王码五笔型输入法”呢(也就是即装即用)?答案是肯定的!因为
4、微软的 Office XP 安装程序做到了,这就表示微软肯定留有一个专门用来安装输入法的接口,一般来说应该是一系列 API 函数。经过一番摸索,笔者在 MSDN 里找到了这个可以用来安装输入法的API:ImmInstallIME()。Ok,现在我们就开始利用这个 API 来实现自己的“王码五笔型输入法”全自动安装程序。一、准备素材 我们先试着从 Office XP 光盘中提取“王码五笔型输入法”的输入法文件。通过Windows 的查找功能在 Office XP 的第一张安装盘中查找与“WINWB”相关的文件,在OFFICE1.CAB 中找到了一下 14 个文件:WINWB86.CHM.*、WI
5、NWB86.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 是五笔型
6、输入法的帮助文件,*.MB 是码表文件,而*.IME 是主要的输入法文件。其中*.IME 和*.MB 有文件名部分以 A 结尾和以 W 结尾两个版本,经过笔者试验证实了它们分别是 ANSI 和 UNICODE 两种版本的输入法文件。文件名部分以 A 结尾的文件适用于 Windows 9x,以 W 结尾的文件适用于 NT 系列 Windows 系统。提取了输入法文件后必须让安装程序针对不同版本的操作系统将它们拷贝到正确的目录,以便调用 API 来进行输入法安装。笔者分别在安装了 Office XP 中自带的“王码五笔型输入法”的 Windows 98SE 和 Windows XP 操作系统中查找
7、以上文件,发现帮助文件都存放在 WINDOWSHELP 目录中(这里假设 Windows 系统都安装在 WINDOWS 目录)。而主要的输入法文件(*.IME)和码表文件(*.MB)在 Windows 9x 下存放于 WINDOWSSYSTEM 目录中,在 NT 系列 Windows 系统中存放于 WINDOWSSYSTEM32 目录中。二、相关 API 函数素材的准备工作已经完成,现在我们来看一下代码编写过程中需要用到的 4 个主要的API 函数。2.12.1 GetVersionGetVersion函数原型:DWORD GetVersion(VOID);该函数返回与当前使用的 Window
8、s 系统版本有关的信息。可以通过判断返回值最高位是否为 1 来判断当前是用的系统是 NT/2000/XP 还是 9x/ME。示例代码:if (GetVersion() #include “resource.h“ #pragma comment(lib, “imm32.lib“) #define IME_WINWB86 0 #define IME_WINWB98 1 BOOL CALLBACK Main_DlgProc(HWND, UINT, WPARAM, LPARAM); LPCTSTR TranslateFileName(LPCTSTR); void InstallIME(int); in
9、t 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 - 消息未处理,返回给默认对话框处理程序处理/ / 备 注:对话框
10、IDD_MAIN 的回调函数/ BOOL CALLBACK Main_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) TCHAR strWINWB86 = “王码五笔型输入法 86 版“;TCHAR strWINWB98 = “王码五笔型输入法 98 版“;TCHAR cBuf30; / 存放 LISTBOX 中 ITEM 文本的缓冲区int nBuf2; / 存放 LISTBOX 中被选中的 ITEM 索引号的缓冲区int nSel; / LISTBOX 中被选种的 ITEM 的数目switch (uMsg)case W
11、M_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:/ 获取
12、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, nBufnSel, (LPARAM)cBuf
13、);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_strFileNameMAX_PATH; / 函数 TranslateFileName 用到的字符串缓冲区/ / 函数名:TranslateFileName/ / 参 数:lpszFileName
14、- 指向用相对路径表示的文件名的字符串指针/ / 返回值:指向用绝对路径表示的文件名的字符串指针/ / 备 注:将以 WINDOWS 目录为基准的用相对路径表示的文件名转换成用绝对 路径表示的文件名/ LPCTSTR TranslateFileName(LPCTSTR lpszFileName) / 获取 WINDOWS 目录的路径GetWindowsDirectory(g_strFileName, MAX_PATH);/ 如果 WINDOWS 目录的路径是根目录if (g_strFileNamelstrlen(g_strFileName)-1 = )/ 去掉路径最后的“”g_strFileN
15、amelstrlen(g_strFileName)-1 = ; / 连接 WINDOWS 目录路径和用相对路径表示的文件名lstrcat(g_strFileName, lpszFileName);return g_strFileName; / / 函数名:InstallIME/ / 参 数:nIMEType - 输入法类型/ / 返回值: 无/ / 备 注:安装指定的输入法/ void InstallIME(int nIMEType) TCHAR strWINWB86A = “王码五笔型 86 版“;TCHAR strWINWB86W = “中文 (简体) - 王码五笔型 86 版“;TCHA
16、R 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(“WINWB86.CNT“, TranslateFileName(“HELPWINWB86.CNT“), FALSE);if (GetVersion() 0x80000000) /