切换时的 AHK Click 事件

AHK Click event while Toggled

我找到了单独工作的 AHK 代码 "ok" 但我需要一个在另一个里面。所以,我有:

1.当您按住鼠标左键时,第一个 快速触发点击:

~$LButton::
    While GetKeyState("LButton", "P"){
    Click
    Sleep .1  ;  milliseconds
    }
return

2。第二个 是一个切换脚本,它发送相同的鼠标左键触发事件,但可以通过按下按钮(在本例中为 F8)来打开和关闭

toggle = 0
#MaxThreadsPerHotkey 2

F8::
    Toggle := !Toggle
    While Toggle{
        Click
        sleep 1
    }
return

我需要的是: 当我按一次 F8 时,我希望我的鼠标左键在按住它的同时快速触发点击事件。当我再次按下 F8 时,它应该什么都不做。如果它很重要,我需要在游戏中按住 Ctrl 键的同时进行这些点击。 我已经阅读了一些关于 AHK 的内容并尝试了这段代码,但它并没有达到我想要的效果:

toggle = 0
#MaxThreadsPerHotkey 2

F8::
    Toggle := !Toggle
    If Toggle{
~$LButton::
    While GetKeyState("LButton", "P"){
    Click
    Sleep .5  ;  milliseconds
    }
    }
return

这个给我关于遗漏 "return" 的错误,但我尝试了很多合并变体。

此外,我已经阅读了很多关于 MaxThreads 的内容,但仍然不知道为什么应该有 2,它有什么用。

首先,不确定您尝试给 Sleep 命令多少时间,但十进制数字不起作用。只是整数,它们以毫秒为单位。 .1.5 可能被解释为 0,但不确定。此外,睡眠命令并不像您想象的那么准确。阅读文档中的备注部分了解更多信息。

其次,您不应该在热键标签内循环。这是不好的做法,因为 AHK 不提供真正的多线程。
不过,归根结底,如果这就是您的全部脚本,那将不会有任何不同。
如果您想开始编写更好更大的脚本,为了将来参考,我将向您展示 timers 的用法。它们应该用于此。

LButton::SetTimer, MyCoolFunction, 0 ;when LButton is clicked down start a timer with the shortest possible period
LButton Up::SetTimer, MyCoolFunction, Off ;when LButton is released, stop the timer

MyCoolFunction()
{
    Click
}

对于您的切换版本,您不想在热键标签内循环:

F8::
    toggle := !toggle
    if(toggle) ;if true
        SetTimer, MyCoolFunction, 0
    else
        SetTimer, MyCoolFunction, Off
return

MyCoolFunction()
{
    Click
}

如果您不知道 toggle := !toggle 到底是什么,并且想知道,您可以阅读我之前的回答 here。它还展示了如何将该代码压缩为一行代码。并且还解释了为什么不需要在脚本顶部定义变量 toggle(正如您所做的那样)。

关于#MaxThreadsPerHotkey2
这是因为 AHK 不提供真正的多线程。当您循环热键定义时,该热键被完全锁定。您不能再次 运行 热键来停止循环。除非,您将热键设置为使用比一个线程(最好称它们为实例)更多的线程。
这样您就可以再次启动热键,并且可以更改 toggle 变量的值以便停止循环。
但同样,您不应该在热键内循环。如果你使用计时器,就像我上面展示的那样,你不需要担心这个肮脏的解决方法。


然后到您要创建的新代码。
那么首先关于你的尝试出了什么问题。我想这是个好主意,但还差得远。很难说它到底出了什么问题,因为它甚至离工作还差得很远。我想我能说的是热键标签 (hotkey::) 在脚本启动时被评估一次,然后再也不会。所以你不能把它们放在一些 运行 时间逻辑中。 Hotkey 命令将用于此。

幸运的是,您的问题实际上比这简单得多。你不需要乱用 Hotkey 命令。
您要做的就是切换热键 on/off。 Suspend 用于这样的用途:
F8::Suspend
现在,每次您按 F8 时,脚本的热键(和热字串)都会切换 on/off。

这是你的最终脚本:

LButton::SetTimer, MyCoolFunction, 0 ;when LButton is clicked down start a timer with the shortest possible period
LButton Up::SetTimer, MyCoolFunction, Off ;when LButton is released, stop the timer

MyCoolFunction()
{
    Click
}

F8::
    Suspend
    SetTimer, MyCoolFunction, Off ;set the timer off just incase we hadn't released LButton before we hit F8
return