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 | 音量- |
home | Home |
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();
});
这样比按键更直观,也不依赖物理按键。