1.什么是按键精灵的插件
按键精灵的插件是由按键精灵官方或用户自己提供的一种功能扩展。由于按键精灵本身只提供脚本制作过程中最常用的功能,而不可能面面俱到。所以,如果您稍懂一点Visual C++编写程序的知识,就可以通过自己写按键精灵插件,实现比较特殊、高级的功能,如文件读写、注册表访问,等等。如果您愿意,还可以把自己写的插件提交给我们,我们可以在按键精灵的最新版中捆绑您编写的插件,和大家共同分享您的智慧!
按键精灵的插件是通过动态链接库(DLL)的形式提供的。这些动态链接库必须满足一定的规范,并且放在按键精灵所在路径的plugin文件夹下。在按键精灵启动的时候,会自动加载plugin文件夹下的每个插件。每个插件可以包含多个“命令”,每个命令则可以看作是一个独立的函数或者子程序。比如我们提供的文件相关操作插件File.dll,就提供了ExistFile(判断文件是否存在)、CopyFile(复制一个文件)、DeleteFile(删除一个文件)等多个命令。
目前按键精灵的插件只能使用Visual C++编写。您不需要懂得很高深的Visual C++编程技巧,也不需要知道插件的技术细节。因为我们已经提供了一个“模板”插件,您只需要在这个模板上按照下文所述的步骤进行一点点修改,一个属于您自己的插件就完成了。我们推荐您使用Visu
al C++ 6.0,也可以用Visual C++.NET。
值得说明的是,由于技术原因,按键精灵的插件目前还不能用Visual Basic、Delphi、JBuilder等常见的开发工具编写。但是有聪明的用户使用VBScript脚本和ActiveX DLL的形式,同样实现了按键精灵的功能扩展,典型的例子如Ringfo大虾制作的QMBoost等等。严格说来,这种功能扩展不能称为按键精灵的插件,但是我们同样欢迎这种类型的功能扩展。
2. 如何制作一个插件
2.1. 准备动手
为按键精灵写一个插件其实非常简单,只需要您有一点Visual C++编程的知识就够了。如果您懂Visual C++编程,就请跟我一步一步的来完成一个简单的插件。
首先得计划一下,我们的插件完成什么功能,再考虑一下这个插件都需要具有哪些命令。这里假设我们的插件是用于字符串操作的,名字就叫String.dll,这个插件目前暂时只有一个命令,名字叫StrLen,是用于得到字符串长度的。也就是说,用户通过使用我们提供的StrLen命令,传入一个字符串,我们给他返回这个字符串的长度。
具体的说,用户可能将来会在按键精灵中这样调用我们的插件命令:
Dim length as integer
Plugin length=String.StrLen(Hello, world)
如果您熟悉按键精灵,那么对第一句话不会陌生,它的意思是定义一个叫length的整数变量。第二句的意思,我们来解析一下:
小结一下,我们的插件名字叫String.dll,里面提供一个命令,名叫StrLen,这个命令接受一个字符串作为参数,返回一个整数值,含义是得到字符串的长度。
OK,下面我们把按键精灵提供的插件模板(在XXX路径下)复制一份,然后在它的基础上进行修改。
2.2. 编写插件的简介、插件命令和插件命令的简介
按键精灵提供的插件模板是一个Visual C++ project,我们用Visual C++ 6.0打开这个project。这个project里面包含了好几个文件,实际上我们只需要修改QMPlugin.cpp这一个文件,其他文件您都可以不用去管。
用Visual C++打开QMPlugin.cpp文件,在文件开头到这样一行:
extern char *g_lpszPluginDescription = "这是一个插件的模板";
这个字符串定义了插件的简介,我们把它改成:
extern char *g_lpszPluginDescription = "这是我的字符串处理插件";
再到QMPlugin.cpp文件最后,有类似于这样的内容:
QMPLUGIN_CMD_INFO g_CommandTable[] =
{
    "Test1","测试1",Test1Handler,
    "Test2","测试2",Test2Handler,
};
字符串长度1是什么意思懂一点C语言的朋友应该知道这是一个结构数组,如果您不懂也没有关系,请注意花括号中间的两行,每一行代表了这个插件的一个命令。插件模板这里已经写了两个命令,其实仅仅是作为示范,没有用处,您可以把这两个命令都删掉,然后用自己定义的命令代替。花括号中间的内容可以看作是一个表格,我们称为“插件命令表”。
每一行从左到右由三个部分组成,第一部分是这个插件命令的名称,第二部分是这个插件命令的简要解释,第三部分我们暂时不管,后面再讲。
我们的字符串处理插件目前只有一个命令 StrLen,所以把代码改成:
QMPLUGIN_CMD_INFO g_CommandTable[] =
{
    "StrLen","得到字符串的长度",Test1Handler,
};
第三部分我们还没有讲,所以暂时先填写一个Test1Handler,一会再回头改。
2.3. 最基本的插件命令处理函数
当按键精灵用户调用我们的StrLen命令的时候,我们需要写一段代码来处理这个命令,并且给按键精灵返回字符串的长度。具体的说,对于每个命令,我们都需要写一个对应的C语言函数来处理用户对这个命令的调用。不管这个命令有几个参数,返回值是什么类型,我们的C语言函数总是这个样子:
int XXXX(char *lpszParamList, char *lpszRetVal)
上面的XXXX是这个函数的名字,随便起什么名字都可以,只要别重名就好。注意,除了函数的名字可以改,其他的地方最好都不要改。
比如我们的StrLen命令,假如它对应的函数叫MyStrLenHandler,那么请在QMPlugin.cpp中增加这样一个函数:
int MyStrLenHandler(char *lpszParamList, char *lpszRetVal)
{
    return 0;
}
我们来看这个函数,它有两个参数lpszParamListlpszRetVal,返回值是整数。lpszParamList中存放了按键精灵传过来的字符串(比如前面例子中的hello, world”这个字符串就会保存在这里),而返回值就是我们要告诉按键精灵的,这个字符串的长度。lpszRetVal暂时还用不上,先不要动它。
了解C语言的朋友都知道在C语言中要得到一个字符串的长度是很容易的,如下:
int MyStrLenHandler(char *lpszParamList, char *lpszRetVal)
{
    return strlen(lpszParamList);
}
插件处理函数就写完了,很简单吧?现在,我们还需要在StrLen这个插件命令和MyStrLenHandler这个命令处理函数之间建立起关联关系。上一节中提到,我们是这样在插件命令表中定义StrLen命令的:
"StrLen","得到字符串的长度",Test1Handler,
前两部分分别代表插件命令的名称和插件命令的简要解释,第三部分,就是这个插件命令的处理函数。也就是说,我们需要改成:
"StrLen","得到字符串的长度", MyStrLenHandler,
    现在,StrLen命令就和MyStrLenHandler函数关联起来了。
    到此为止,我们已经编写了一个最简单的插件。不妨用Visual C++编译这个project,把生成的DLL文件改名为String.dll,然后放在按键精灵的plugin目录下。启动按键精灵,运行这样一个简单的按键精灵脚本:
Dim length as integer
Plugin length=String.StrLen(Hello, world)
VBSCall MessageBox(CStr(length))
这个脚本会弹出一个对话框,对话框里面的数字就是Hello, world这个字符串的长度。
2.4. 返回值为字符串的插件命令
下面我们为String这个插件再增加一个命令,名字叫StrRev,这个命令接受一个字符串作为参数,返回值是把参数中字符串的内容倒置,比如把”hello”变成”olleh”。和StrLen不同的是,它的返回值不是整数,而是一个字符串。
不管怎么样,我们都需要为这个命令建立一个处理函数,假如这个处理函数名字叫MyStrRev
Handler,这个函数的原型必须是:
int MyStrRevHandler(char *lpszParamList, char *lpszRetVal)
可是,我们希望在这个函数里面返回一个字符串,应该如何处理呢?按键精灵规定:如果lpszRetVal的内容被命令处理函数修改过,则忽略命令处理函数返回的整数值,认为这个命令处理函数返回的是lpszRetVal这个字符串。
也就是说,如果我们把按键精灵传来的字符串倒置后,只要复制到lpszRetVal指向的字符串中,导致lpszRetVal发生了修改,则这个命令的返回值就被认为是lpszRetVal
那么,我们的MyStrRevHandler处理函数应该这样编写:
int MyStrRevHandler(char *lpszParamList, char *lpszRetVal)
{
    strcpy(lpszRetVal, _strrev(lpszParamList));
    return 0;
}
我们首先调用C语言标准库函数_strrev把字符串lpszParamList(也就是按键精灵传来的字符串)倒置,然后调用C语言标准库函数strcpy把倒置后的结果复制到lpszRetVal中。
最后,StrRev这个命令同样需要记录在插件命令表中,现在我们的插件命令表变成:
QMPLUGIN_CMD_INFO g_CommandTable[] =
{
    "StrLen","得到字符串的长度", MyStrLenHandler,

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。