常用API数参数5Word文档下载推荐.docx
《常用API数参数5Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《常用API数参数5Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
重启后通过控制面板添加输入法
整个过程中拷贝输入法文件和增加注册表项可以用批处理和导入注册表文件来简化操作,但必须重启计算机才能在控制面板里添加输入法,这同样让使用者觉得比较烦琐。
那么作为一个编程爱好者能不能通过写个小程序来实现在不重新启动计算机的情况下全自动的安装“王码五笔型输入法”呢(也就是即装即用)?
答案是肯定的!
因为微软的OfficeXP安装程序做到了,这就表示微软肯定留有一个专门用来安装输入法的接口,一般来说应该是一系列API函数。
经过一番摸索,笔者在MSDN里找到了这个可以用来安装输入法的API:
ImmInstallIME()。
Ok,现在我们就开始利用这个API来实现自己的“王码五笔型输入法”全自动安装程序。
一、准备素材
我们先试着从OfficeXP光盘中提取“王码五笔型输入法”的输入法文件。
通过Windows的查找功能在OfficeXP的第一张安装盘中查找与“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结尾的文件适用于Windows9x,以W结尾的文件适用于NT系列Windows系统。
提取了输入法文件后必须让安装程序针对不同版本的操作系统将它们拷贝到正确的目录,以便调用API来进行输入法安装。
笔者分别在安装了OfficeXP中自带的“王码五笔型输入法”的Windows98SE和WindowsXP操作系统中查找以上文件,发现帮助文件都存放在WINDOWSHELP目录中(这里假设Windows系统都安装在WINDOWS目录)。
而主要的输入法文件(*.IME)和码表文件(*.MB)在Windows9x下存放于WINDOWSSYSTEM目录中,在NT系列Windows系统中存放于WINDOWSSYSTEM32目录中。
二、相关API函数
素材的准备工作已经完成,现在我们来看一下代码编写过程中需要用到的4个主要的API函数。
2.1GetVersion
DWORDGetVersion(VOID);
该函数返回与当前使用的Windows系统版本有关的信息。
可以通过判断返回值最高位是否为1来判断当前是用的系统是NT/2000/XP还是9x/ME。
示例代码:
if(GetVersion()<
0x80000000)
//NT/2000/XP
else
//9x/ME
2.2CopyFile
BOOLCopyFile(LPCTSTRlpExistFileName,LPCTSTRlpNewFileName,BOOLbFailIfExists);
该函数将以lpExistFileName指向的字符串为文件名的文件复制为以lpNewFileName指向的字符串为文件名的新文件。
这里的文件名可以包含文件路径。
最后的参数bFailIfExists决定当新文件已存在时是否覆盖现有文件,如果为FALSE,则覆盖。
CopyFile("
c:
a.txt"
"
d:
.txt"
FALSE);
以上代码将c盘下的a.txt文件复制到D盘下并命名为b.txt。
如果已经存在b.txt,则覆盖原来的文件。
2.3ImmInstallIME
HKLImmInstallIME(LPCTSTRlpszIMEFileName,LPCTSTRlpszLayoutText);
这是制作“王码五笔型输入法”全自动安装程序的关键函数。
函数的两个参数分别为输入法IME文件的文件名和在控制面板的是输入法选项中显示的输入法名称。
函数调用后将返回一个被安装输入法的输入法标识符(或称做输入法句柄)。
HKLhKL=ImmInstallIME("
winwb86.ime"
王码五笔型输入法86版"
);
以上代码将输入法文件c:
winwb86.ime安装到系统中,并命名为“王码五笔型输入法86版”。
函数调用后返回安装的输入法的标识符,存放在hKL变量中。
2.4ImmIsIME
BOOLImmIsIME(HKLhKL);
该函数判断hKL指向的输入法是否有效。
我们可以用ImmInstallIME函数的返回值作为该函数参数,通过函数返回值来判断输入法是否安装成功。
if(ImmIsIME(hKL))
//安装输入法成功
//安装失败
hKL为调用ImmInstallIME()后得到的输入法标识符。
三、创建工程并添加代码
1.打开VisualC++6.0,通过菜单File-New新建一个名为“WINWB”的“Win32Application”工程(如图1),单击“OK”。
2.在应用程序类型选择中选择“Anemptyproject”(图2),单击“Finsish”。
这样我们就新建好了一个空的Win32应用程序工程。
3.通过菜单Project-AddtoProject-New添加一个“ResourceScript”资源文件,命名为“WINWB”(如图3)。
4.通过菜单Insert-Resource添加一个新的Dialog资源(如图4)。
5.调整Dialog资源的若干属性。
在Dialog的任意空白区域双击鼠标左键打开属性对话框,在属性对话框的Gerneral选项卡中更改ID为“IDD_MAIN”、Caption属性为“王码五笔型输入法安装程序”(如图5)。
单击Font按钮,更改字体为宋体9号(这是简体中文版XP的标准字体型号)。
单击MoreStyles选项卡,选中Center属性,使对话框能在屏幕中居中显示(如图6)。
6.关闭属性对话框,回到资源编辑界面。
删掉系统自动添加的“Cancel”按钮并更改“OK”按钮的Caption属性为“安装”(如图7)。
7.添加一个新的StaticText控件,打开属性对话框更改Caption属性为“请选择输入法版本:
”(如图8)。
8.添加一个新的ListBox控件,打开属性对话框更改ID为“IDC_LIST”(如图9):
并更改它的Selection属性为“Multiple”(如图10)。
9.适当调整控件的大小和位置,完成资源创建(如图11):
10.通过菜单Project-AddtoProject-New添加一个“C++SourceFile”代码文件,命名为“WINWB”(如图12):
11.在新添加“WINWB.CPP”文件中输入程序代码,代码如下:
#include<
windows.h>
#include"
resource.h"
#pragmacomment(lib,"
imm32.lib"
)
#defineIME_WINWB86 0
#defineIME_WINWB98 1
BOOL CALLBACK Main_DlgProc(HWND,UINT,WPARAM,LPARAM);
LPCTSTR TranslateFileName(LPCTSTR);
void InstallIME(int);
intWINAPIWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
DialogBox(hInstance,(LPCTSTR)IDD_MAIN,NULL,Main_DlgProc);
return0;
}
//
//函数名:
Main_DlgProc
//参 数:
hDlg-对话框句柄
// uMsg-消息值
// wParam、lParam-消息参数
//返回值:
TRUE -消息已处理
// FALSE-消息未处理,返回给默认对话框处理程序处理
//备 注:
对话框IDD_MAIN的回调函数
BOOLCALLBACKMain_DlgProc(HWNDhDlg,UINTuMsg,WPARAMwParam,LPARAMlParam)
TCHAR strWINWB86[]="
;
TCHAR strWINWB98[]="
王码五笔型输入法98版"
TCHAR cBuf[30];
//存放LISTBOX中ITEM文本的缓冲区
int nBuf[2];
//存放LISTBOX中被选中的ITEM索引号的缓冲区
int nSel;
//LISTBOX中被选种的ITEM的数目
switch(uMsg)
{
caseWM_INITDIALOG:
//初始化LISTBOX
SendDlgItemMessage(hDlg,IDC_LIST,LB_ADDSTRING,0,(LPARAM)strWINWB86);
SendDlgItemMessage(hDlg,IDC_LIST,LB_ADDSTRING,0,(LPARAM)strWINWB98);
returnTRUE;
caseWM_COMMAND:
switch(LOWORD(wParam))
{
//响应“退出”按钮
caseIDCANCEL:
EndDialog(hDlg,0);
returnTRUE;
//响应“添加”按钮
caseIDOK:
//获取LISTBOX中被选中的ITEM的数目及索引号
nSel=SendDlgItemMessage(hDlg,IDC_LIST,LB_GETSELITEMS,2,(LPARAM)nBuf);
if(nSel==0)
{
MessageBox(hDlg,"
请选择输入法版本!
"
提示信息"
MB_OK);
returnTRUE;
}
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版
}
elseif(lstrcmp(cBuf,strWINWB98)==0)
InstallIME(IME_WINWB98);
//安装王码五笔型输入法98版
}
default:
returnFALSE;
}
TCHARg_strFileName[MAX_PATH];
//函数TranslateFileName用到的字符串缓冲区
TranslateFileName
lpszFileName-指向用相对路径表示的文件名的字符串指针
指向用绝对路径表示的文件名的字符串指针
将以WINDOWS目录为基准的用相对路径表示的文件名转换成用绝对路径表示的文件名
LPCTSTRTranslateFileName(LPCTSTRlpszFileName)
//获取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);
returng_strFileName;
InstallIME
nIMEType-输入法类型
无
安装指定的输入法
voidInstallIME(intnIMEType)
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);
WINWB86.CHM"
HELPWINWB86.CHM"
WINWB86.CNT"
HELPWINWB86.CNT"
if(GetVersion()<
0x80000000) //NT/2000/XP系统
//复制UNICODE版输入法文件
CopyFile("
WINWB86W.IME"
SYSTEM32WINWB86.IME"
WINWB86W.MB"
SYSTEM32WINWB86.MB"
//安装UNICODE版输入法
hKL=ImmInstallIME(TranslateFileName("
),strWINWB86W);
else //9X/ME系统
//复制ANSI版输入法文件
WINWB86A.IME"
SYSTEMWINWB86.IME"
WINWB86A.MB"
SYSTEMWINWB86.MB"
//安装ANSI版输入法
),strWINWB86A);
//验证输入法句柄是否有效
if(ImmIsIME(hKL))
MessageBox(NULL,"
安装王码五笔型输入法86版成功!
else
安装王码五笔型输入法86版失败!
elseif(nIMEType==IME_WINWB98)
WINWB98.HLP"
HELPWINWB98.HLP"
WINWB98.CHM"
HELPWINWB98.CHM"
WINWB98.CNT"
HELPWINWB98.CNT"
WINWB98W.IME"
SYSTEM32WINWB98.IME"
WINWB98W.MB"
SYSTEM32WINWB98.MB"
),strWINWB98W);
WINWB98A.IME"
SYSTEMWINWB98.IME"
WINWB98A.MB"
SYSTEMWINWB98.MB"
),strWINWB98A);
安装王码五笔型输入法98版成功!
安装王码五笔型输入法98版失败!
四、制作安装包
在菜单Build-SetActiveConfiguration设置工程配置为“Win32–Release”,然后进行编译、连接。
将编译、连接后生成的可执行文件Releasewinwb.exe与前面提取出来的14个王码五笔型输入法文件放在同一目录中,我们的王码五笔型输入法全自动安装程序就完成了。
但作为一个小功能程序,需要携带15个文件,未免有些不太方便。
同时也为了使我们的程序看上去更专业点,我们可以使用一些压缩软件或者安装包制作工具来将它制作成一个单一文件的软件安装包,这样也可以方便携带和使用。
这里笔者推荐使用Windows2000/XP自带的一个安装包制作工具——IExpress,它采用微软的CAB压缩文件格式,能生成自解压缩文件,是一款小巧、免费的安装包制作工具。
具体制作步骤如下:
1.在开始菜单的运行中键入“iexpress”,单击确定打开IExpress程序(如图13)。
2.保持默认选项“CreatenewSelfExtractionDirectivefile”,单击下一步继续。
3.保持默认选项“Extractfilesandrunaninstallationcommand”,单击下一步继续。
4.进入“Packagetitle”界面,在编辑框中输入“解压缩文件”(如图14),这是将生成的安装包解压缩时出现的对话框的标题栏,可以随意设定。
输入完成后单击下一步继续。
5.保持默认选项“Noprompt”,单击下一步继续。
6.保持默认选项“Donotdisplayalicense”,单击下一步继续。
7.进入“Packagedfiles”界面,单击“Add”按钮,在打开文件对话框中选中王码五笔型输入法安装程序的所有15个文件(如图15和图16),单击下一步继续。
8.进入“InstallProgramto”,在“InstallProgram”下拉式组合框中选中“WINWB.exe”(如图17),单击下一步继续。
9.保持默认选项“Default(recommended)”,单击下一步继续。
10.保持默认选项“Nomessage”,单击下一步继续。
11.进入“PackageNameandOptions”界面,单击