aardio 文档

aardio 范例: 自动扫雷

//自动扫雷
//https://bbs.aardio.com/forum.php?mod=viewthread&tid=3581
import winex;
import mouse;
import process;

//启动扫雷游戏
import process.winmine;
var prcs = process.winmine();

//自进程内存读取结构体,写内存用 prcs.write 函数。
var setting = prcs.readStruct(0x01005330,{
    INT count; //雷点个数
    INT width;//棋盘宽
    INT height;//棋盘高
})

if(false){  
    //方法一:鼠标模式
    hwnd = winex.waitVisible("扫雷");//获取窗口句柄
    win.showForeground(hwnd);//激活窗口

    sweep = function(x,y){
        x,y = win.toScreen(hwnd,1+16*x,50+16*y); //转换为屏幕坐标
        mouse.click(x,y,true); //在指定坐标模拟鼠标单击
    }
}
else{  
    //方法二:远程Call( 直接调用 EXE 里的函数 )
    var addrCall = 0x010037E1 //call地址
    var addrPoint = 0x01005118 //call参数:addrCallPoint:x   addrCallPoint+4:y

    //获取远程call
    var act = prcs.remoteApi("void()", addrCall);

    sweep = function(x,y){
        //写入结构体到外部进程
        prcs.write(addrPoint,{
            INT x = x;
            INT y = y;
        }) 

        act(); //远程Call 点击函数
        thread.delay(10); //加点延时
    }
}

var addrDatabase = 0x1005340 //棋盘基址
for(y=1;setting.height){
    for(x=1;setting.width){
        //未点击时:无雷:0f;;;有雷,8f (有用),点击后:无雷:4x,x=周围雷的个数;;;有雷8x
        n = prcs.readNumber(addrDatabase+x+32*y,"byte") //棋盘基址+x+y*32=棋盘点的值
        if(n==0x0f) sweep(x,y);
    }
}

//释放进程对象
prcs.free();
Markdown 格式