Autohotkey 切换时单击AHK事件
我发现AHK代码可以单独工作,但我需要一个在另一个里面。因此,我: 一,。按住鼠标左键时,第一次快速触发单击:Autohotkey 切换时单击AHK事件,autohotkey,Autohotkey,我发现AHK代码可以单独工作,但我需要一个在另一个里面。因此,我: 一,。按住鼠标左键时,第一次快速触发单击: ~$LButton:: While GetKeyState("LButton", "P"){ Click Sleep .1 ; milliseconds } return 二,。第二个是一个切换脚本,它发送相同的鼠标左键触发事件,但在这种情况下,可以通过按F8键来打开和关闭 toggle = 0 #MaxThreadsPerHotkey 2 F8
~$LButton::
While GetKeyState("LButton", "P"){
Click
Sleep .1 ; milliseconds
}
return
二,。第二个是一个切换脚本,它发送相同的鼠标左键触发事件,但在这种情况下,可以通过按F8键来打开和关闭
toggle = 0
#MaxThreadsPerHotkey 2
F8::
Toggle := !Toggle
While Toggle{
Click
sleep 1
}
return
我需要的是:当我按下F8键一次时,我希望我的鼠标左键在按住它的同时快速触发click事件。当我再次按F8键时,它应该不会起任何作用。如果这很重要,我需要在游戏中按住Ctrl键的同时单击鼠标。
我读过一些关于AHK的文章,并尝试过这段代码,但它没有达到我想要的效果:
toggle = 0
#MaxThreadsPerHotkey 2
F8::
Toggle := !Toggle
If Toggle{
~$LButton::
While GetKeyState("LButton", "P"){
Click
Sleep .5 ; milliseconds
}
}
return
这一个给了我关于丢失返回的错误,但是我尝试了很多合并变体
另外,我已经读了很多关于MaxThreads的书,但仍然不知道为什么应该有2以及它的用途。首先,我不确定您尝试发出命令的时间长度,但十进制数字不起作用。只有整数,以毫秒为单位。1和.5可能被解释为0,但不确定。另外,sleep命令并不像您想象的那样准确。有关更多信息,请阅读文档中的备注部分 其次,您不应该在热键标签内循环。这是一种糟糕的做法,因为AHK不提供真正的多线程。 不过,在一天结束的时候,如果这都是你的剧本,那就没什么区别了。 作为将来的参考,如果你想开始编写更好更大的脚本,我将向你展示的用法。它们应该用于此目的
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
}
如果您不知道切换是什么:=!实际上,我想知道的是,你可以阅读我之前的答案。它还展示了如何将代码压缩为一行代码。并且还解释了为什么不需要像以前那样在脚本顶部定义变量切换
大约2:
这是因为AHK不提供真正的多线程。当你循环一个热键定义时,热键被完全锁定。无法再次运行热键来停止循环。除非将热键设置为更好地使用多个线程来调用多个实例。
这样,您就可以再次启动热键,并可以更改切换变量的值,从而停止循环。
但同样,您不应该在热键内循环。如果你使用定时器,就像我上面展示的那样,你不需要担心这个肮脏的变通方法
然后是要创建的新代码。
首先谈谈你的尝试出了什么问题。我想这是个好主意,但还差一点。很难说它到底出了什么问题,因为它甚至还没有工作。我想我能说的是,热键标签hotkey::在脚本启动时计算一次,然后再也不会计算。所以你不能把它们放在运行时逻辑中。该命令将用于此目的
幸运的是,你的问题其实要简单得多。您不需要乱用热键命令。
你要做的就是打开/关闭热键。是这样使用的:
F8::挂起
现在,每次按F8时,脚本的热键和热字符串都会打开/关闭
这是你最后的剧本:
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
我非常感激,但这并不能解决这项任务。从头开始-我需要一个切换开/关的脚本,这样在切换开之前它不会影响任何东西。当切换到on时,当我按下鼠标左键时,它应该持续快速地发送点击事件。它应该为我解决的问题:我在玩《流放之路》,有一个5x12网格的清单。当你们交易时,你们可以按住Ctrl键并点击商品来发送它。所以,对于完整的库存,您需要60次点击。我想在脚本上切换,按住Ctrl键,按下鼠标按钮,然后在整个网格上移动鼠标。这正是答案中的代码所做的。也许这就是为什么你认为它没有。对热键使用修改器,这样即使按住额外的修改器,热键也会触发。示例:*LButton::With the*它的工作原理和它应该的完全一样!我还添加了Suspend SetTimer、MyCoolFunction、Off以在开始时禁用-它是草率的还是正常的?如果您希望它以Suspend开始,请确保可以将Suspend设置为脚本的第一行。但不需要额外的检查来关闭计时器。