qmplugin.cpp
来自「AppWizard has created this QMPlugin DLL 」· C++ 代码 · 共 211 行
CPP
211 行
/*********************************************************************
这里是按键精灵的插件模板
欢迎您为按键精灵制作插件!
这个模板是使用标准C++编写的
褚瑞 2005.3
*********************************************************************/
#include "stdafx.h"
#include "stdio.h"
#include "QMPlugin.h"
#include "CmdInfo.h"
#include "shlobj.h"
#include "Commdlg.h"
/*********************************************************************
欢迎您为按键精灵制作插件!
按键精灵的每个插件可以支持若干条命令。
如果您需要写一条自己的命令,需要遵循以下步骤:
1. 打开文件QMPlugin.cpp
2. 翻页到最后,找到表格g_CommandTable,仔细阅读相关说明
3. 在表格g_CommandTable中填写一行,包括命令名称、说明和处理函数
4. 仿照下面的函数Test1Handler或者Test2Handler编写你自己的处理函数
5. 编译形成DLL文件,把DLL文件改成你喜欢的,不会和别人冲突的名字,把文件放在按键精灵的Plugin目录下
6. 打开按键精灵,进入编辑脚本界面,打开“插件命令”面板,编写脚本测试你的插件!
如果有不明白的地方,欢迎发email到rchu@vrbrothers.com询问。祝你成功!
褚瑞 2005.3
*********************************************************************/
//这是关于插件的一些描述信息,请根据你的插件的具体情况来替换下面的中文文字。
extern char *g_lpszPluginDescription = "文件操作的插件";
int ExistFile(char *lpszParamList, char *lpszRetVal)
{
DWORD dwFileAttr = GetFileAttributes(lpszParamList); //只有一个字符串参数,可以不用分割参数了
if(dwFileAttr & FILE_ATTRIBUTE_DIRECTORY) //是文件夹
return 2;
else if(dwFileAttr > 0) //是文件
return 1;
else
return 0; //出错或者没有找到
}
int SelectDirectory(char *lpszParamList, char *lpszRetVal)
{
BROWSEINFO sBrowseDirectoryInfo = {0};
LPITEMIDLIST lpSelectDirectoryReturn = NULL;
sBrowseDirectoryInfo.lpszTitle = "";
sBrowseDirectoryInfo.ulFlags = BIF_RETURNONLYFSDIRS;
lpSelectDirectoryReturn = SHBrowseForFolder(&sBrowseDirectoryInfo);
if(lpSelectDirectoryReturn == NULL) //没有作出选择(如选择了“取消”)
return 0;
SHGetPathFromIDList(lpSelectDirectoryReturn,lpszRetVal); //这里会修改lpszRetVal,因此这个插件命令将返回一个字符串
return 0;
}
int SelectFile(char *lpszParamList, char *lpszRetVal)
{
char lpszBuffer[4096] = {0};
OPENFILENAME sOpenFileDialogInfo = {0};
sOpenFileDialogInfo.lStructSize = sizeof(sOpenFileDialogInfo);
sOpenFileDialogInfo.lpstrFile = lpszBuffer;
sOpenFileDialogInfo.nMaxFile = sizeof(lpszBuffer);
sOpenFileDialogInfo.Flags = 6148;
if(GetOpenFileName(&sOpenFileDialogInfo) == 0) //如果选择了"取消"
return 0;
strcpy(lpszRetVal,lpszBuffer); //复制到lpszRetVal,,因此这个插件命令将返回一个字符串
return 0;
}
int ReadINI(char *lpszParamList, char *lpszRetVal)
{
char lpszSectionName[1024] = {0}, lpszKeyName[1024] = {0}, lpszINIFilePath[1024] = {0};
ParseParam(lpszParamList,lpszSectionName,lpszKeyName,lpszINIFilePath);
char lpszBuffer[4096] = {0};
GetPrivateProfileString(lpszSectionName,lpszKeyName,"",lpszBuffer,sizeof(lpszBuffer),lpszINIFilePath);
strcpy(lpszRetVal,lpszBuffer); //复制到lpszRetVal,,因此这个插件命令将返回一个字符串
return 0;
}
int WriteINI(char *lpszParamList, char *lpszRetVal)
{
char lpszSectionName[1024] = {0}, lpszKeyName[1024] = {0}, lpszINIFilePath[1024] = {0};
char lpszBuffer[4096] = {0};
ParseParam(lpszParamList,lpszSectionName,lpszKeyName,lpszBuffer,lpszINIFilePath);
return WritePrivateProfileString(lpszSectionName,lpszKeyName,lpszBuffer,lpszINIFilePath);
}
int CopyFile_(char *lpszParamList, char *lpszRetVal)
{ //以下函数的名字后面加下划线,是为了和系统的同名API函数区分
char lpszTargetFile[2048] = {0}, lpszSourceFile[2048] = {0};
ParseParam(lpszParamList,lpszSourceFile,lpszTargetFile);
return CopyFile(lpszSourceFile,lpszTargetFile,FALSE);
}
int MoveFile_(char *lpszParamList, char *lpszRetVal)
{
char lpszTargetFile[2048] = {0}, lpszSourceFile[2048] = {0};
ParseParam(lpszParamList,lpszSourceFile,lpszTargetFile);
return MoveFile(lpszSourceFile,lpszTargetFile);
}
int DeleteFile_(char *lpszParamList, char *lpszRetVal)
{
return DeleteFile(lpszParamList);
}
int OpenFile_(char *lpszParamList, char *lpszRetVal)
{
return (int)CreateFile(lpszParamList,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
}
int CloseFile_(char *lpszParamList, char *lpszRetVal)
{
return CloseHandle((HANDLE)atoi(lpszParamList));
}
int ReadFile_(char *lpszParamList, char *lpszRetVal)
{
char lpszHandle[16] = {0}, lpszReadLength[16] = {0};
ParseParam(lpszParamList,lpszHandle,lpszReadLength);
DWORD dwNumberOfBytesRead;
ReadFile((HANDLE)atoi(lpszHandle),lpszRetVal,atoi(lpszReadLength),&dwNumberOfBytesRead,NULL);
lpszRetVal[dwNumberOfBytesRead] = 0; //加上字符串结束标示
return 0;
}
int ReadLine(char *lpszParamList, char *lpszRetVal)
{
DWORD dwNumberOfBytesRead;
char *lpszCurrentReadPos = lpszRetVal;
//windows api居然没有读取一行的函数,只好自己写了。效率可能有点低,将就着用吧
do
{
ReadFile((HANDLE)atoi(lpszParamList),lpszCurrentReadPos,1,&dwNumberOfBytesRead,NULL);
if(*lpszCurrentReadPos++ == '\n') //读到行末
break;
} while(dwNumberOfBytesRead);
*lpszCurrentReadPos = 0; //加上字符串结束标示
return 0;
}
int WriteFile_(char *lpszParamList, char *lpszRetVal)
{
char lpszHandle[16] = {0}, lpszWriteContent[65536];
ParseParam(lpszParamList,lpszHandle,lpszWriteContent);
DWORD dwNumberOfBytesWrite;
return WriteFile((HANDLE)atoi(lpszHandle),lpszWriteContent,strlen(lpszWriteContent),&dwNumberOfBytesWrite,NULL);
}
int WriteLine(char *lpszParamList, char *lpszRetVal)
{
char lpszHandle[16] = {0}, lpszWriteContent[65536];
ParseParam(lpszParamList,lpszHandle,lpszWriteContent);
DWORD dwNumberOfBytesWrite;
strcat(lpszWriteContent,"\r\n"); //和WriteFile的唯一区别是后面多了回车换行符
return WriteFile((HANDLE)atoi(lpszHandle),lpszWriteContent,strlen(lpszWriteContent),&dwNumberOfBytesWrite,NULL);
}
int SeekFile(char *lpszParamList, char *lpszRetVal)
{
char lpszHandle[16] = {0}, lpszOffset[16] = {0};
ParseParam(lpszParamList,lpszHandle,lpszOffset);
SetFilePointer((HANDLE)atoi(lpszHandle),atoi(lpszOffset),NULL,FILE_BEGIN);
return 0;
}
int GetFileLength(char *lpszParamList, char *lpszRetVal)
{
return GetFileSize((HANDLE)atoi(lpszParamList),NULL);
}
/*********************************************************************
* 名称:g_CommandTable
* 说明:这是一个struct数组,数组中的每一个元素代表了本插件支持的一条命令。数组的元素数目就是本插件支持的命令数目
* 每个struct中有4个成员,分别是命令名称(如下面的"Test1"),命令的中文解释(如下面的"测试1"),命令的执行函数(如下面的Test1Handler),命令的参数个数(如下面的2)
* 你可以把它看成一个表格,表格中的每一行代表了一条插件命令。当你需要新增一条插件命令的时候,就需要在表格里面加一行。
* 作者: 褚瑞
* 时间 : 2005-03-30 19:56:25
*********************************************************************/
QMPLUGIN_CMD_INFO g_CommandTable[] =
{
"ExistFile","判断文件或文件夹是否存在(文件路径)[返回=0:不存在,1:存在文件,2:存在文件夹]",ExistFile,1,
"SelectDirectory","弹出选择目录对话框,返回所选择的路径",SelectDirectory,0,
"SelectFile","弹出选择文件对话框,返回所选择的文件全路径",SelectFile,0,
"CopyFile","复制一个文件(要复制的文件,要复制的目标)",CopyFile_,2,
"MoveFile","移动一个文件(要移动的文件,要移动的目标)",MoveFile_,2,
"DeleteFile","删除一个文件(要删除的文件)",DeleteFile_,1,
"ReadINI","读一个INI文件(小节名,键名,INI文件路径)[返回读出内容]",ReadINI,3,
"WriteINI","写一个INI文件(小节名,键名,要写的内容,INI文件路径)",WriteINI,4,
"OpenFile","打开一个文件(文件路径)[返回=-1:打开失败,其他:文件的句柄]",OpenFile_,1,
"CloseFile","关闭一个打开的文件(文件句柄)",CloseFile_,1,
"ReadFile","从文件当前位置读取一定长度(文件句柄,读取长度)[返回读取的内容]",ReadFile_,2,
"ReadLine","从文件当前位置读一行内容(文件句柄)[返回读取的内容]",ReadLine,1,
"WriteFile","往文件当前位置写入一个字符串(文件句柄,要写入的字符串)",WriteFile_,2,
"WriteLine","往文件当前位置写一个字符串并换行(文件句柄,要写入的字符串)",WriteLine,2,
"SeekFile","设置当前文件读写位置(文件句柄,相对文件头的读写位置)",SeekFile,2,
"GetFileLength","得到文件长度(文件句柄)[返回文件长度]",GetFileLength,1,
};
//计算本插件支持的所有命令的个数
int g_iCommandCount = sizeof(g_CommandTable) / sizeof(QMPLUGIN_CMD_INFO);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?