不可阻挡的脚本问题

Unstoppable script Issue

我有一个使用多个鼠标移动的脚本,在需要时,我按 F3 停止移动强制重新加载或 ESC 停止移动退出应用程序。正常速度下没问题。

问题是:当我降低mousespeed并增加mousedelay时,脚本变得无法停止:我按了几次F2、F3和ESC键(试图让它停止ps)但是脚本忽略它并继续 运行 鼠标移动。

这是我的问题的一个最小示例:

SendMode Input

$F1::
SetDefaultMouseSpeed, 50
SetMouseDelay, 30

Mousemove, 200, 200
Mousemove, 600, 600
Mousemove, 200, 200
Mousemove, 600, 600
Mousemove, 200, 200
Mousemove, 600, 600
Mousemove, 200, 200
Mousemove, 600, 600
Mousemove, 200, 200
Mousemove, 600, 600
Mousemove, 200, 200
Mousemove, 600, 600
Mousemove, 200, 200
Mousemove, 600, 600
Mousemove, 200, 200
Mousemove, 600, 600
Mousemove, 200, 200
Mousemove, 600, 600
Mousemove, 200, 200
Mousemove, 600, 600
Mousemove, 200, 200
Mousemove, 600, 600

SoundPlay, *48
return

$F2:: Pause
$F3:: Reload
$ESC:: ExitApp

为什么会发生,我该如何解决(即使是低速+高延迟,我怎样才能停止脚本)? ps: F1 键启动鼠标移动序列。

具有 non-zero 速度的 MouseMove 不能被同一个 AHK 脚本中的另一个热键中断,因为 Autohotkey 在内部是 single-threaded(它只是 emulates thread-like behavior) and performs a blocking sleep 每次鼠标微动,直到它达到整体您指定的距离。

解决方案:

  • 检查是否在每次 每次 MouseMove 后 按下热键,但它是 non-instantaneous;
  • 实现您自己的 MouseMove,在每次 1px 移动后检查 GetKeyState
  • 使用带热键的主脚本 run/pause/stop child:

    停止:微不足道,使用Process Close
    运行: child 应该隐藏托盘图标,否则它将在进程关闭后保留
    暂停:不平凡但有 solutions (see also the underlying mechanics).