个人备案网站内不能出现什么内容,义乌 网站建设推广营销,定制高端网站建设公司,有域名有服务器怎么做网站C/Qt 集成 AutoHotkey 前言AutoHotkey 介绍 方案一#xff1a;子进程启动编写AutoHotkey脚本准备 AutoHotkey 运行环境编写 C/Qt 代码 方案二#xff1a;显式动态链接方案探索编译动态链接库集成到C工程关于AutoHotkeyDll.dll中的函数原型 总结 前言
上一篇介绍了AutoHotkey… C/Qt 集成 AutoHotkey 前言AutoHotkey 介绍 方案一子进程启动编写AutoHotkey脚本准备 AutoHotkey 运行环境编写 C/Qt 代码 方案二显式动态链接方案探索编译动态链接库集成到C工程关于AutoHotkeyDll.dll中的函数原型 总结 前言
上一篇介绍了AutoHotkey的基本情况和使用其功能丰富易用于是搬出我们的老朋友 C/Qt将AutoHotkey 集成到 C/Qt开发环境使其为我们所用。
AutoHotkey 介绍
上一篇链接 C AutoHotkey 开源项目介绍 方案一子进程启动
上一篇我们介绍了AutoHotkey可以通过命令行启动于是自然而然的想到了在我们的工程中使用命令行启动AutoHotkey脚本 编写AutoHotkey脚本
编写一个简单的ahk脚本如
MsgBox hello world!准备 AutoHotkey 运行环境
为了方便测试将需要的依赖和ahk脚本放在了同一路径下如图 编写 C/Qt 代码
创建一个Qt命令行工程用于集成测试编写代码如下
#include QCoreApplication
#include QProcess
#include QDebugint main(int argc, char *argv[])
{QCoreApplication a(argc, argv);auto executeTerminalCommand [](const QString command){QProcess process;process.start(cmd, QStringList() /c command);process.waitForStarted();process.waitForFinished();QString error QString::fromLocal8Bit( process.readAllStandardError());if(!error.isEmpty()){qDebug() error: error;}QString result QString::fromLocal8Bit( process.readAllStandardOutput() );return result;};executeTerminalCommand(D:/test/AutoHotkey.exe D:/test/hello.ahk);return a.exec();
}以上代码使用QProcess启动cmd命令行启动了ahk脚本运行结果如图
这种方式简单易用没什么心智负担但如果你的软件需要分发给其他用户使用你就必须要打包AutoHotkey.exe 和ahk脚本文件一眼就被别人看穿的感觉并不愉快于是我们继续探索其它方案。 方案二显式动态链接
方案探索
在AutoHotkey项目的README中看到如下内容 字面意思不太易于理解进入 README-LIB.md 链接中继续寻找发现其并不是所预期的编译为动态库供其它软件链接而是在ahk中启用另一个ahk以在V2版本的ahk中启用V1版本功能等等但文档中发现了有趣的线索 进入 HotKeyIt/ahkdll 链接查看项目简介 说明了“为其它编程语言、脚本语言打开了AutoHotkey的世界”正是我们的需求话不多说开始验证 编译动态链接库
下载ahkdll源码到本地解压后如图 可以看出是visual studio的工程不折腾直接使用vs构建vs打开工程文件这里我使用的是vs2019配置切换为releaseDll、x64右键AutoHotkey项目点击生成 在项目的bin/x64w 下找到了AutoHotkeyDLL.dll
集成到C工程
妥善安置 AutoHotkeyDll.dll编写代码如下注意动态库路径
#include Windows.h
#include winuser.h
#include iostream
#include libloaderapi.h
#include comdef.husing namespace std;LPTSTR strToLPTSTR(string str)
{_bstr_t bstr(str.c_str());return (LPTSTR)bstr;
}int main()
{typedef BOOL (*AhkReady)(void);typedef BOOL (*AhkExec)(LPTSTR script);typedef UINT_PTR (*AhkDll)(LPTSTR script,LPTSTR p1,LPTSTR p2);HINSTANCE handle LoadLibrary(LD:\\test\\AutoHotkeyDLL.dll);AhkDll ahkdll (AhkDll)GetProcAddress(handle, ahkdll);AhkReady ahkReady (AhkReady)GetProcAddress(handle, ahkReady);AhkExec ahkExec (AhkExec)GetProcAddress(handle, ahkExec);LPTSTR empty strToLPTSTR();ahkdll(empty, empty, empty);ahkReady();string script MsgBox \hello world!\;ahkExec(strToLPTSTR(script));return 0 ;
}以上代码显式链接AutoHotkeyDll.dll定义函数指针调用函数在程序中以字符串的形式运行ahk脚本运行结果如图
关于AutoHotkeyDll.dll中的函数原型
函数原型来自于 ahkdll 项目中 source 文件夹下的 exports.h如 ahkExec 函数 总结
两种方案都可方便的将AutoHotkey集成到其它编程语言中命令行启动、显式动态链接并不是 c 或 Qt 的特性利用AutoHotkey丰富易用的功能及多年积累下的生态我们可以开发出更多有用的功能。