非root 环境下 如何模拟人工按钮不放的操作

已存档
七月CX · 2 个月前
第 1 条补充
·
2 个月前

while (!click('确定')); 如果我用这种方法实现按下不松手,但同时我还会操作其他点击动作,需要把while (!click('确定'));放入线程么

第 2 条补充
·
2 个月前

// 文档地址 https://docs.hamibot.com/
auto.waitFor();

// 创建一个线程用于持续点击“确定”
threads.start(function() {
while (!click('确定')) {
// 可以添加适当的延时,避免过于频繁的尝试
sleep(500);
}
toast("确定按钮已点击成功");
});

// 主线程继续执行其他操作
toast("开始执行其他操作");

// 示例:点击另一个按钮
while (!click('下一步'));

toast("其他操作已完成"); 这个线程当我不用的时候该怎么停止

回答

Hamibot AI
1
· 2 个月前

在非 root 环境下,你可以使用 RootAutomator.longPress(x, y, duration) 或者 RootAutomator.press(x, y, duration) 来模拟按钮按住不放的操作。这些方法需要 root 权限才能正常运行。

如果你没有 root 权限,则可以尝试通过无障碍服务来实现类似的效果,例如使用 click(text[, i]) 函数来点击特定文本或按钮。然而,这种操作无法完全模拟长时间按住按钮不放的行为。

以下是一个简单的示例代码,展示了如何使用 click(text[, i])

// 文档地址 https://docs.hamibot.com/
auto.waitFor();

// 尝试点击特定文本
while (!click('确定')); // 替换为你要点击的按钮文本

这段代码会持续尝试点击指定的文本(如“确定”),直到成功为止。请注意,这种方法依赖于无障碍服务,并且只能点击屏幕上有明确文本的区域。

如果你需要更复杂的触摸操作(如长按、滑动等),建议设备具有 root 权限以确保功能的完整性。


补充回答 1

如果你使用 while (!click('确定')) 这种方式来持续尝试点击“确定”按钮,它会阻塞当前线程,直到点击成功。这意味着在此期间,脚本的其他操作将无法执行。

如果你想在持续点击“确定”的同时进行其他操作(比如点击其他按钮或处理其他任务),你可以将这个循环放入一个独立的线程中运行,这样就不会影响主线程的操作。

下面是一个示例代码,展示了如何将 while (!click('确定')) 放入一个线程中:

// 文档地址 https://docs.hamibot.com/
auto.waitFor();

// 创建一个线程用于持续点击“确定”
threads.start(function() {
    while (!click('确定')) {
        // 可以添加适当的延时,避免过于频繁的尝试
        sleep(500);
    }
    toast("确定按钮已点击成功");
});

// 主线程继续执行其他操作
toast("开始执行其他操作");

// 示例:点击另一个按钮
while (!click('下一步'));

toast("其他操作已完成");

说明:

  1. 线程创建:通过 threads.start() 创建一个新的线程,用于持续尝试点击“确定”。
  2. 延时:在循环中添加了 sleep(500),避免过于频繁的尝试点击,减少系统负担。
  3. 并行操作:主线程可以继续执行其他任务,比如点击“下一步”。

通过这种方式,你可以在后台持续尝试点击“确定”,同时不影响其他操作的执行。


补充回答 2

在线程中执行 while (!click('确定')) 这样的循环时,如果需要在点击完成前手动停止该线程,可以使用 Thread.interrupt() 方法来中断线程的执行。

下面是如何控制线程启动和停止的完整示例:

// 文档地址 https://docs.hamibot.com/
auto.waitFor();

var clickThread;

// 启动一个线程用于持续点击“确定”
clickThread = threads.start(function () {
    while (true) {
        if (click('确定')) {
            toast("确定按钮已点击成功");
            break;
        }
        sleep(500); // 避免过于频繁尝试点击
    }
});

toast("开始执行其他操作");

// 示例:点击另一个按钮
while (!click('下一步')) {
    sleep(500);
}

toast("其他操作已完成");

// 停止点击“确定”的线程(如果它还在运行)
if (clickThread && clickThread.isAlive()) {
    clickThread.interrupt();
    toast("已中断确定按钮的点击线程");
}

关键点说明:

  1. 线程对象保存:将 threads.start(...) 的返回值保存到变量 clickThread 中,这样就可以通过该对象控制线程。
  2. 判断线程是否存活:使用 clickThread.isAlive() 来判断线程是否仍在运行。
  3. 中断线程:调用 clickThread.interrupt() 可以中断线程的执行,防止它继续尝试点击。

注意事项:

  • interrupt() 并不会立即终止线程,而是中断线程的阻塞状态(如 sleep()wait() 等),你需要确保线程内部有退出循环的逻辑。
  • 如果你已经让线程自然退出了(例如点击成功并跳出循环),就不需要再调用 interrupt()
ℹ️ 本回答由 AI 生成,内容仅供参考