aardio + AutoHotkey 混合编程,制作漂亮界面
yuyutoo 2024-10-12 01:16 13 浏览 0 评论
aardio 小、轻、快,专注于 Windows 桌面软件快速开发。在 aardio 中可以调用很多编程语言,例如 C语言、C++、C#、Java、Python、R、Javascript、Node.Js、Fortran、VB、Flash ActionScript、PHP、VBScript、PowerShell、NewLISP、AutoLISP、Delphi、FreeBASIC、Ruby、Rust、Julia、Nim、Go 语言、批处理 ...... 请参考《 aardio 调用第三方编程语言示例》。
本文我们主要介绍 aardio + AutoHotkey 混合编程。
1、双击打开:aardio 工具 / 扩展库
2、扩展库名字输入 ahk,搜索结果中双击 ahk 扩展库 —— 打开最新范例。
aardio 提供了 ahk 扩展库可用于嵌入 AutoHotkey 并与 AutoHotkey 交互调用,支持 AutoHotkey v1 以及 AutoHotkey v2 版本。
先看 aardio 调用 AutoHotkey v1 的简单例子,aardio 可以直接调用 AutoHotkey 函数,AutoHotkey 也可以调用 aardio 函数,非常简单:
import win.ui;
/*DSG{{*/
var winform = win.form(text="嵌入 AutoHotkey v1 演示")
winform.add(
edit={cls="edit";left=17;top=18;right=741;bottom=445;edge=1;multiline=1;z=1}
)
/*}}*/
//导入 AutoHotkey v1 扩展库
import ahk;
/*
导出允许AutoHotkey 调用的 aardio 函数(函数名必须以 on 开头)。
*/
ahk.onTest = function(param){
winform.edit.print( "winform.onTest被ahk调用",param );
winform.show();
}
//运行ahk代码
ahk.run( `
#Persistent ;保持 AHK 线程不退出
#NoTrayIcon ;不显示托盘图标
#include <aardio> ;启动 AHK 代码中必须加入这句才能与 aardio 交互
; 定义函数与 aardio 有点像,aardio 一般会写为 GetPoint = function(hwnd){ return value;}
GetPoint(){
; 直接调用aardio函数,支持任意类型、不定个数的调用参数
aardio.onTest({ x : 2, y : 3 })
return { x : 2, y : 3 }
}`);
/*
直接调用ahk里定义的全局函数,
参数和返回值自动支持各种数据类型,就像调用普通aardio函数。
是不是很神奇?!
*/
var point = ahk.GetPoint();
winform.edit.print("调用ahk函数的返回值:",point);
win.loopMessage();
请注意 aardio 中文件路径以斜杆(或反斜杆)开始表示应用程序根目录,应用程序根目录在开发时指工程目录或工程外独立启动的文件所在目录,发布后指 EXE 所在目录。应用程序根目录已设为 AHK 工作目录 %A_WorkingDir% 。
导出 aardio 函数给 ahk 时也可以返回一个异步执行的函数对象,调用虚拟桌面示例:
import ahk;
import dotNet.desktop;
import win.ui;
/*DSG{{*/
var winform = win.form(text="虚拟桌面切换";right=599;bottom=399)
winform.add(
edit={cls="edit";left=17;top=18;right=565;bottom=374;edge=1;multiline=1;z=1}
)
/*}}*/
//导出 AutoHotkey 函数
ahk.onSwitch = function(index){
winform.edit.print("已切换桌面到:",index);
//虚拟桌面在键盘钩子中需要通过返回异步函数异步调用。
return function() {
dotNet.desktop.get(index).MakeVisible()
}
}
//运行 AutoHotkey 代码注册热键
ahk.run( `
#Persistent
#NoTrayIcon
#include <aardio>
^j:: aardio.onSwitch(1)
^k:: aardio.onSwitch(2)
`);
winform.show();
win.loopMessage();
如果在 aardio 中执行以下代码:
ahk.import("path/libName");
则由 aardio 导入
\AutoHotkey\Lib\path\libName.ahk
可以在 aardio 工程中添加上面的 ahk 文件 到内嵌资源目录,这样该 ahk 文件会被编译到 exe 资源内,运行时自动转存为以下文件:
%A_MyDocuments%\AutoHotkey\Lib\path\libName.ahk
在 AHK 中可以使用以下代码引用该模块:
#include <path/libName>
在 aardio 中可使用 ahk.setGlobal() 函数修改 AHK 全局变量:
//直接修改 AHK 全局变量的值
ahk.setGlobal("gVar","测试一下")
在 aardio 中执行 AHK 代码时还可以支持 aardio 模板语法,也就是在 AHK 代码中可以直接写 aardio 代码,只要将 aardio 代码包含在 <? ?> 标记中就可以了(类似 PHP 模板语法),例如:
//运行 AHK 代码
ahk.run( `
#Persistent ;
#NoTrayIcon ;
#include <aardio> ;
global gVar := "<?="允许嵌入 aardio 代码"?>" ;
`);
//直接修改 AHK 全局变量的值
ahk.setGlobal("gVar","测试一下")
关于 aardio 模板语法请参考 aardio 文档。
在 aardio 使用 ahk.thread 扩展库可以调用 AutoHotkey v2,ahk.thread 不再需要在 AHK 启动代码中包含 #include <aardio>,其他用法与调用 ahk 扩展库类似。下面看例子:
import win.ui;
/*DSG{{*/
var winform = win.form(text="嵌入 AutoHotkey v2 演示")
winform.add(
edit={cls="edit";left=8;top=10;right=749;bottom=452;edge=1;multiline=1;z=1}
)
/*}}*/
winform.show();
import ahk.thread;
var ahk2 = ahk.thread();
//直接定义允许 AHK 调用的 aardio 函数(函数名以on开头)
ahk2.onTest = function(param){
winform.edit.print( "winform.onTest被ahk调用",param );
return 123
}
//运行 AHK 代码
ahk2.run( `
#NoTrayIcon ;不显示托盘图标
Persistent( true) ;保持ahk线程不退出
; 定义函数与 aardio 有点像,aardio 一般会写为 GetPoint = function(hwnd){ return value;}
GetPoint(){
; 直接调用aardio函数,支持任意类型、不定个数的调用参数
aardio.onTest({ x : 2, y : 3 })
return { x : 2, y : 3 }
}`);
/*
直接调用ahk里定义的全局函数,
参数和返回值自动支持各种数据类型,就像调用普通aardio函数。
是不是很神奇?!
*/
var point = ahk2.GetPoint();
winform.edit.print("调用ahk函数的返回值:",point);
win.loopMessage();
要注意 AHK 中的变量默认是局部变量,定义全局变量要用 global 语句,aardio 则是默认全局变量,定义局部变量要用 var 语句。
有了前面的基础,我们再将范例稍微整复杂一点,例如调用 AHK v1 :
import win.ui;
/*DSG{{*/
var winform = win.form(text="嵌入 AutoHotkey v1")
winform.add(
edit={cls="edit";left=17;top=18;right=734;bottom=444;edge=1;multiline=1;z=1}
)
/*}}*/
import ahk;
ahk.onTest = function(param){
winform.edit.print( "winform.onTest被ahk调用",param );
winform.show();
}
ahk.run( `
#Persistent
#NoTrayIcon
#include <aardio>
GetPoint(){
; 命令式语法 = 号后面是字符串,变量要放到百分号里
POINT_TYPE =
(
UInt x;
UInt y;
) ; 首尾两个括号都必须独占一行,用于包含多行字符串
; 新语法 := 后面是表达式,和其他编程语言类似字符串放引号里,变量不用放百分号里
point := Struct( POINT_TYPE ) ;
; 取结构体指针,aardio 里调用 API 时结构体总是自动转为指针,不需要写这些代码
ptr := point[]
; DllCall("user32.dll\GetCursorPos", "Ptr", ptr)
GetCursorPos(ptr) ;
; 直接调用aardio函数,支持任意类型、不定个数的调用参数
aardio.onTest({ x : point.x, y : point.y })
; 命令式语法, 百分号加一个空格表示后面是表达式
MsgBox, % "x:" point.x ",y:" point.y
return { x : point.x, y : point.y }
}`);
/*
直接调用ahk里定义的全局函数
*/
var point = ahk.GetPoint();
winform.edit.print("调用ahk函数的返回值:",point);
win.loopMessage();
以上主要是演示 aardio 与 AHK 交互,其实 aardio 直接调用 ::User32.GetCursorPos() 代码更简单,示例:
// 当然上面的代码用 aardio 直接写会更简单,例如:
var point = {int x;int y};
//不用声明直接调用 API,不用写参数类型这些
::User32.GetCursorPos(point);
aardio 可以免声明直接调用 WinAPI ,不需要指定参数类型。
下面再来个例子,使用 aardio 暂停、继续 AHK 脚本:
import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
var winform = win.form(text="嵌入autohotkey演示";right=757;bottom=467)
winform.add(
button={cls="plus";text="暂停AHK";left=19;top=11;right=109;bottom=41;bgcolor=-6960024;font=LOGFONT(name='FontAwesome';charset=0);z=2};
edit={cls="edit";left=17;top=56;right=729;bottom=443;edge=1;multiline=1;z=1}
)
/*}}*/
import ahk;
var handle = ahk.run( `
#Persistent ;保持ahk线程不退出
#NoTrayIcon ;不显示托盘图标
#include <aardio> ;启动ahk代码中必须加入这句才能与aardio交互
::hj::run无乱码
`);
winform.button.onMouseClick = function(){
if(winform.button.text=="暂停AHK"){
thread.suspend(handle)
winform.button.text = "继续AHK"
}
else {
thread.resume(handle)
winform.button.text = "暂停AHK"
}
}
winform.button.skin({
color={
active=0xFFFFFFFF;
default=0xFF000000;
hover=0xFFFFFFFF
};
});
winform.show();
win.loopMessage();
aardio 制作图形界面很方便,请参考 aardio 开始页的教程《使用 plus 控件制作精美界面》。下面我们看一下 aardio 制作的一些开源软件。
通用输入法状态提示工具 ImTip:
极简录屏工具 Gif123:
系统五笔助手 WubiLex:
相关推荐
- 从零搭建高可用的 MySQL 主从复制架构(基于 Linux 实战指南)
-
背景在生产环境中,单点MySQL数据库容易成为性能瓶颈或单点故障源。搭建MySQL主从复制架构,可以实现读写分离、高可用,提升系统的整体稳定性与扩展性。...
- 国外大神成功让Nexus4吃上安卓6.0:基本可正常使用
-
IT之家讯10月9日消息谷歌已经于10月6日正式开启了Nexus设备Android6.0Marshmallow系统的OTA升级推送。根据之前报道的消息,老一批的Nexus手机如Nexus4/Ne...
- 急死!CPU被挖矿了,却找不到哪个进程
-
CPU起飞了最近有朋友在群里反馈,自己服务器的CPU一直处于高占用状态,但用...
- 甜甜的安卓5.0却让手机ROOT难度大大增加
-
IT之家(www.ithome.com):甜甜的安卓5.0却让手机ROOT难度大大增加对设备进行ROOT,毫无疑问,这是安卓最美丽的地方之一,不管是对于消费者来说还是开发者。Root意味着掌握更多的权...
- Linux基础知识(linux基础知识点及答案)
-
系统目录结构/bin:命令和应用程序。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,该目录...
- Linux 内核 6.15 发布:内存、网络、文件系统全面升级!
-
核心增强:性能与安全双飞升!Linux内核6.15的正式版!虽然因一个临门一脚的Bug晚了几小时,但最终还是带着一堆硬核更新闪亮登场!...
- AlmaLinux 9.6 发布,新增功能亮点纷呈!
-
距离上一版本AlmaLinux9.5发布六个月后,基于5.14内核的AlmaLinux正式宣布其企业级Linux发行版的9.x系列第六个更新——AlmaLinux9.6(Sag...
- 理解Linux下的SELinux(linux seccomp)
-
理解Linux下的SELinux长久以来,每当遇到授权问题或者新安装的主机,我的第一反应是通过setenforce0命令禁用SELinux,来减少产生的权限问题,但是这并不是一个良好的习惯。这篇文章...
- 3个简单实用的网址导航网站(简洁的网站导航)
-
在我们使用电脑上网的时候经常会访问某些常用的网站,每一次都去通过搜索访问就比较浪费时间,添加在浏览器收藏夹不方便在其他电脑使用。找一个好用的网址导航网站就可以帮我们把所有常用的网址集合在一个页面,方便...
- 整点不一样的网站制作教程,教你怎么用网站模板制作网站#...
-
网站制作教程整点不一样的网站。不要再问我网站制作教程了,今天给你整个怎么用网站模板制作网站的教程。·1、登录账号进入后台。·2、选择模板。自助建站平台通常提供各种各样的网站模板,可以根据自己的需求和喜...
- 5个最好的外贸独立站模板,让你的网站更加专业
-
作为外贸行业从业者,一个专业且具有吸引力的网站是必不可少的。然而,建立一个专业的网站需要耗费大量的时间和精力,尤其是在设计和开发方面。为了帮助您缩短网站建设的时间和成本,以下是5个最好的外贸独立站模板...
- 网站建设模板 **网站建设模板:全面指南与创意构思*
-
网站建设模板**网站建设模板:全面指南与创意构思**随着互联网技术的迅猛发展,网站已成为企业、机构和个人展示自身形象、传递信息、实现交流的重要平台。本文将详细介绍网站建设的基本模板,并提供创意...
- 原地封神!一个只用套模板即可制作电子相册的网站
-
对于忙碌的年轻人来说,一键操作的模板意味着无需复杂的操作步骤,就能轻松制作出精美的电子相册。但是一个好的工具也是事关重要,最近发现了一款非常适合年轻人的模板---FLBOOK在线制作电子杂志平台,只需...
- 跨屏建站网kpfree免费网站模板2023.1.14发布更新
-
跨屏建站网kpfree免费网站模板2023.1.14发布更新,摒弃了之前的卡片式设计,采用了移动优先的设计原则,简化了页面设计风格,优化了代码,优化了图片质量,确保网页打开速度。砍掉了一些花哨而无用的...
- 响应式大型电子企业集团类网站模板源码-青柠资源网qnziyw.cn
-
模板信息:模板编号:10964模板编码:UTF8模板颜色:红色模板分类:科技、电子、数码设备适合行业:电子设备类企业模板介绍:本模板自带eyoucms内核,无需再下载eyou系统,原创设计、手工书写D...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)