切换时的 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
(正如您所做的那样)。
关于#MaxThreadsPerHotkey
2
:
这是因为 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
我找到了单独工作的 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
(正如您所做的那样)。
关于#MaxThreadsPerHotkey
2
:
这是因为 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