Autohotkey 切换时单击AHK事件

Autohotkey 切换时单击AHK事件,autohotkey,Autohotkey,我发现AHK代码可以单独工作,但我需要一个在另一个里面。因此,我: 一,。按住鼠标左键时,第一次快速触发单击: ~$LButton:: While GetKeyState("LButton", "P"){ Click Sleep .1 ; milliseconds } return 二,。第二个是一个切换脚本,它发送相同的鼠标左键触发事件,但在这种情况下,可以通过按F8键来打开和关闭 toggle = 0 #MaxThreadsPerHotkey 2 F8

我发现AHK代码可以单独工作,但我需要一个在另一个里面。因此,我:

一,。按住鼠标左键时,第一次快速触发单击:

~$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设置为脚本的第一行。但不需要额外的检查来关闭计时器。