本文主要介绍 aardio + AutoHotkey 混合编程。

在 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 编程语言快速入门 —— 语法速览 》

▶ 使用 ahk 扩展库

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 调用 AutoHotkey v2

在 aardio 使用 ahk.thread 扩展库可以调用 AutoHotkey v2,ahk.thread 不再需要在 AHK 启动代码中包含 #include ,其他用法与调用 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.yreturn { 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 + AutoHotkey 混合编程相关推荐

  1. matlab两个多项式相除,C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  2. C和C++混合编程的Makefile的编写!

    在项目实践中,经常遇到C和C++混合编程的情况. 目前的业务需求是: c写的几个文件,和一个C++文件要整合为一个动态库,被C++调用.而这个动态库的生成过程中,会链接几个基础的开发库,比如libz, ...

  3. 怎样用matlab打开mw文,C# matlab混合编程 MWArray使用笔记

    C# matlab混合编程 徐凯Email:xukai19871105@http://www.doczj.com/doc/1a6e191fff00bed5b9f31dbf.html 这几天突然想搞一搞 ...

  4. matlab2014a + win764bit + vs2013混合编程(.m转成dll供C++调用)

    在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目的. 1. 使用matlab生成dll文件 1.1 首先需要带有 ...

  5. .Net(c#) 通过 Fortran 动态链接库,实现混合编程

    c# 与 Fortran 混合编程解决方案主要有两种: 1. 进程级的交互:在 Fortran 中编译为控制台程序,.Net 调用(System.Diagnostics.Process),然后使用 P ...

  6. c 与matlab混编,谈谈Matlab与C/C++或C#的互调用(混合编程)

    记得当初一个师姐问我知不知道如何在Matlab里调用C++的程序,还真把我问住了.因为我以前就知道C++调用Matlab的方法,这方面网上资料一大堆.没想到现在自己突发奇想又遇到另外一个问题,Matl ...

  7. Linux C++与Python混合编程(g++生成链接库与python调用)

    gcc/g++ 链接库的编译与链接 这一篇对动态链接库和静态链接库以及编译结果讲得很清楚,目前看到最好的. Linux下Python与C++混合编程

  8. 基于引擎的matlab+vc混合编程的配置

    前段时间在项目中做了一些关于基于引擎的vc+matlab混合编程的工作. 如果你是混合编程新手,我相信使用引擎的方式编程是比较简单快捷的一种方式. 当然这种方法也有其缺点,就是不能脱离matlab运行 ...

  9. 开题:在移动开发中使用JavaScript进行混合编程提高代码复用率

    2019独角兽企业重金招聘Python工程师标准>>> 问题 通常开发一个移动应用,因为存在iOS和Android两种操作系统,因此所有代码都要使用两种语言编写两遍,因此几乎所有开发 ...

最新文章

  1. golang中的strings.Fields
  2. MAX Script 脚本语言
  3. cocos2d-x3.0 实现HTTP请求GET、POST
  4. boost::container模块实现抛出异常
  5. linux 内核dmesg,linux內核調試kmsg,dmesg
  6. 【转】使用JDK自带jvisualvm监控tomcat
  7. Web框架——Flask系列之Flask-SQLAlchemy安装与使用 定义数据模型(八)
  8. java写手机游戏_如何将自己编写的JAVA小游戏写到手机里?
  9. 360浏览器如何进行皮肤更换
  10. 京东云Ubuntu下安装mysql
  11. UVA 1411 - Ants(二分图完美匹配)
  12. 笔记-js高程-第七章 函数表达式
  13. 操作系统面试相关总结
  14. 有道Java_有道词典java版下载-有道词典java豪华版v1.0.7 安卓版 - 极光下载站
  15. Python pandas库的简单使用
  16. boobooke ORACLE MYSQL C JAVA视频学习资料
  17. ubuntu10.10下安装五笔86输入法
  18. 简单3步,给小程序加个官方的吐槽功能吧!
  19. Spring Boot配置Tomcat容器、Jetty容器、Undertow容器
  20. shell编程中空格的使用

热门文章

  1. 移动POS机刷信用卡时需要打开GPS定位吗?移动pos机GPS定位的好处有啥?
  2. 【智能计算系统笔记】第一章笔记及课后习题
  3. 搜索系统中的Learning To Rank模型:GBRank
  4. FastApi 快速上手使用
  5. Ubuntu下编译NASA开源深空影像处理软件:Ames Stereo Pipeline
  6. invariant java_React Native Invariant Violation:查看配置
  7. geoserver笔记
  8. divergence
  9. 我的世界java2b2t服务器地址_我的世界2b2t服务器怎么进 2b2t服务器ip是什么
  10. MATLAB slice函数绘制三维n×m×k矩阵的立体图或剖面图 —可视化四维数据