Autox.js 中文文档 下载 App

Autox.js 按键监听 events.onKey 音量键 Home 键触发动作

给手机加一组"物理快捷键"

Autox.js 可以监听手机的物理按键事件(音量键、Home、返回、电源键等),让它们变成脚本的触发器。比如"按音量+暂停脚本、按音量-恢复、长按音量+结束"。

基本用法

events.onKey("volume_up", function (e) {
    toast("音量+被按下了");
    // 执行你想做的事
    stopScript();
});

// 按音量-做另一件事
events.onKey("volume_down", function (e) {
    toast("音量-触发");
});

可用的键名

键名物理按键
volume_up音量+
volume_down音量-
homeHome
back返回
recent最近任务
power电源键
camera相机键
volume_mute静音键(部分机型)

长按和短按区分

有些场景需要区分"按一下"和"长按不放":

let pressStartTime = 0;

events.onKey("volume_down", function (e) {
    if (e.event === "down") {
        pressStartTime = Date.now();
    } else if (e.event === "up") {
        let duration = Date.now() - pressStartTime;
        if (duration > 500) {
            toast("长按音量-");
            // 长按执行
        } else {
            toast("短按音量-");
            // 短按执行
        }
    }
});

e.event 的值是 "down"(按下)和 "up"(松开)。

实战:音量键控制脚本暂停/恢复

console.show();

let isPaused = false;

// 音量+:暂停/恢复
events.onKey("volume_up", function (e) {
    if (e.event !== "up") return;
    
    if (isPaused) {
        isPaused = false;
        toast("脚本恢复运行");
    } else {
        isPaused = true;
        toast("脚本已暂停");
    }
});

// 音量-:立即结束
events.onKey("volume_down", function (e) {
    if (e.event === "up") {
        toast("脚本已终止");
        exit();
    }
});

// 主循环
for (let i = 0; i < 100; i++) {
    if (isPaused) {
        sleep(500);  // 暂停时空转
        continue;
    }
    
    console.log("执行第 " + (i + 1) + " 步");
    // ... 你的实际操作 ...
    sleep(1000);
}

注意事项

1. 监听需要无障碍服务

按键监听依赖无障碍服务,没有开无障碍的话 events.onKey() 不会生效。

2. 某些系统版本有限制

部分 Android 版本(尤其是新版)可能限制某些按键的监听权限。如果某个键监听不到,可以换别的键试试。

3. 不要忘了注销

脚本结束前如果不手动注销监听器,它们会一直占用资源。虽然脚本退出后系统会自动清理,但显式注销是好习惯:

let listener = events.onKey("volume_up", handler);
// ...使用...
listener.remove();  // 手动注销

4. 系统音量控制会冲突

按音量+时如果系统音量也跟着变了,说明你的监听器没有拦截这个事件。在某些机型上,可以用 event.preventDefault() 阻止系统默认行为:

events.onKey("volume_up", function (e) {
    e.preventDefault();  // 阻止系统调音量
    toast("收到");
});

用悬浮窗代替按键

如果按键监听不稳定,另一种方式是在悬浮窗上放按钮:

let w = floaty.window(
    <frame gravity="center">
        <button id="pause" text="暂停" w="80" h="40"/>
        <button id="stop" text="结束" w="80" h="40" ml="10"/>
    </frame>
);

w.pause.click(() => {
    toast("暂停/恢复");
    isPaused = !isPaused;
});

w.stop.click(() => {
    exit();
});

这样比按键更直观,也不依赖物理按键。