百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

aardio + AutoHotkey 混合编程,制作漂亮界面

yuyutoo 2024-10-12 01:16 9 浏览 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:

相关推荐

Java的经典垃圾收集器G1,如何设置参数,什么场景下适用?

G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器.以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。G1将Java堆划分为多个大...

这份Java面试八股文让329人成功进入大厂,堪称2021最强

前言2021秋招即将来临,很多同学会问Java面试八股文有必要背吗?我的回答是:很有必要。你可以讨厌这种模式,但你一定要去背,因为不背你就进不了大厂。国内的互联网面试,恐怕是现存的、最接近科举考试的制...

JDK成长记7:3张图搞懂HashMap底层原理

...

深度解析HashMap集合底层原理(hashmap集合特点)

目录...

网络安全之对文件上传的思考(文件上传功能中出现安全问题)

在web渗透中,最简单直接的方式就是文件上传。但是不做任何检测,直接getshell的现在已经很少了.我在平时的授权测试中,遇到的大多数都是对上传的文件内容,格式等检测的比较多的按前端到后端绕过顺序分...

JVM常用参数自查笔记(jvm参数怎么看)

配置堆区:-Xms、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn;-Xms:表示java虚拟机堆区内存初始内存分配的大小,通常为操作系统可用内存的1/64大小即可,但仍...

JAVA集合(java集合类有哪些分别有什么特点)

JAVA集合1.接口集成关系和实现集合类存放于Java.util包中,主要有3种:set(集)、list(列表包含Queue)和map(映射)。1.Collection:Collection...

体育老师教你学Java语言(中篇)(教java的老师)

一、控制结构训练营1.条件语句if-else→赛前资格审查...

十年之重修ConcurrentHashMap原理

弱小和无知并不是生存的障碍,傲慢才是。...

安装JDK(安装jdk的详细步骤)

JDK下载地址:JDK组成:javac:编译器,将源程序转成字节码。jar:打包工具,将相关的类文件打包成一个文件。javadoc:文档生成器,从源码注释中提取文档。jdb:debugger,查错...

零基础编程入门!手把手教你学Java

...

CentOS 7 上安装 JDK 8 的步骤:(centos7下载jdk)

CentOS7上安装JDK8的步骤:一、下载JDK...

JDK为什么废弃永久代,而引入元空间

今天我们来说说这个JVM的相关知识,因为面试简直是问到麻木的问题,那就是关于JVM的相关知识,今天了不起再次来和大家聊一下这个知识,我们从一些比较奇怪的问题说起,也不说那些经常会问到的内容了,...

JDK 1.8中对象被访问的具体过程及步骤

JDK1.8中对象被访问的过程和步骤对象的创建与初始化当使用new关键字创建一个Java对象时,JVM需要执行以下步骤:...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者...

取消回复欢迎 发表评论: