【AHK】【脚本】setTimer和getKeyStates的问题
本帖最后由 iLouis 于 2024-2-21 16:03 编辑很多游戏要疯狂点击鼠标,我就想着搞一个和DNF的连发一样,按下就等于不停点,松开就等于不点了的脚本,解约鼠标寿命,也方便操作。
LButtonLabel() {
Send({LButton})
return
}
XButton1::{
SetTimer(LButtonLabel, 50)
}
XButton1 up::{
SetTimer(LButtonLabel, 0)
}
后来发现会出现BUG。
一、点击的速度不正常。
二、松开侧键还是在点(有时)。
就变成了
lButtonFlag := false
lButtonLabel() {
if (WinActive('ahk_class xxx')) {
return
}
Send({LButton})
return
}
XButton1::{
if (lButtonFlag){
return
}
lButtonFlag := true
SetTimer(LButtonLabel, 50)
}
XButton1 up::{
lButtonFlag := false
SetTimer(LButtonLabel, 0)
}
这样之后发现,点击的速度是正常了。但是依旧时不时会出现松开还在点的问题。
然后我又试了if (!getKeyState('XButton1', 'P')) return。
检测侧键的物理状态是否按下。
但是依旧会出现有时候松开了还在点。
于是我在点击和松开的函数内,添加了播放音效。并且在计时器函数内添加了tooltip显示状态。
结果发现,在松开按键还在点的情况时。
一、Xbutton1 up,并没有成功触发。
二、getKeyState('XButton1', 'P')的返回值为1。即函数认为侧键在物理状态下是按下的。
然后我想着是不是因为绑定的是鼠标。
所以我尝试了使用键盘按键,也就是我的思路来源,DNF连发。但是我早已不玩,所以用记事本测试。
#HotIf WinActive('ahk_class Notepad')
xClick() {
if (!GetKeyState('x', 'P')) {
return
}
Send('{x}')
return
}
x:: {
SetTimer(xClick, 10)
}
x up:: {
SetTimer(xClick, 0)
}
#HotIf
依旧会出现有时候松开了x但是记事本依旧在疯狂打x的情况。
且添加音效和tooltip之后,也是,出问题的时候,x up不触发。GetKeyState('x', 'P')的返回值是1。
所以请问下,有没有解决方案。多谢。
https://static.52pojie.cn/static/image/hrline/4.gif
2024/02/21 16:00
大概解决了,send换sendEvent其他的不变。
用setTimer和loop或者while实现都行。 本帖最后由 lysuro 于 2024-2-21 01:37 编辑
;F12为总开关,默认运行即开启疯狂按键模式,按F12一次为关闭,再按F12一次又为开启,交替循环。
#SingleInstance force
Process, Priority, , high
SetKeyDelay, 0,1
SetStoreCapslockMode, Off
开启状态 = 1
#IfWinActive, ahk_class Notepad
F12::
{
开启状态 := !开启状态
}
Return
$x::
{
If 开启状态 != 0
{
Loop
{
If GetKeyState("x","P")
{
Send {x}
Sleep, 1
}
Else
{
Break
}
}
}
Else
{
Send {x}
Sleep, 100
}
}
Return
#IfWinActive ;F12为总开关,默认运行即开启疯狂按键模式,按F12一次为关闭,再按F12一次又为开启,交替循环。
#SingleInstance force
Process, Priority, , high
SetKeyDelay, 0,1
SetStoreCapslockMode, Off
开启状态 = 1
F12::
{
开启状态 := !开启状态
}
Return
$XButton1::
{
If 开启状态 != 0
{
Loop
{
If GetKeyState("XButton1","P")
{
Send {LButton}
Sleep, 1
}
Else
{
Break
}
}
}
Else
{
Send {XButton1}
Sleep, 100
}
}
Return 终于有人用ahk了 毒奶粉连发,以前做过,现在早都不玩了 zl1312 发表于 2024-2-21 11:57
毒奶粉连发,以前做过,现在早都不玩了
牛牛牛~~~ 应该是getKeyStates和sendinput钩子冲突问题导致的,send默认是使用sendinput的 lysuro 发表于 2024-2-21 01:29
;F12为总开关,默认运行即开启疯狂按键模式,按F12一次为关闭,再按F12一次又为开启,交替循环。
#SingleI ...
一样的,时不时会出现已经松开了按键,但是依旧在跑的情况,getKeyState('x', 'P')的返回值是1。
#Requires AutoHotkey v2.0.11
#Warn
SetStoreCapsLockMode False
SetNumLockState 'AlwaysOn'
SetDefaultMouseSpeed 0
SetKeyDelay -1
selfKill() {
ExitApp
}
SoundPlayOn() {
SoundPlay('C:\Windows\Media\Speech On.wav')
}
SoundPlayOff() {
SoundPlay('C:\Windows\Media\Speech Off.wav')
}
#HotIf WinActive('ahk_class Notepad')
$x:: {
Loop {
ToolTip(GetKeyState("x", "P"))
If (!GetKeyState("x", "P") || !WinActive('ahk_class Notepad')) {
SoundPlayOff()
return
}
Send('{x}')
Sleep(10)
}
return
}
#HotIf
#HotIf WinActive('ahk_exe code.exe')
~^s::
{
Send('^{s}')
if (!RegExMatch(WinGetTitle('ahk_exe code.exe'), '(newTest)|(MelvorIdelAHK)\.ahk'))
return
Sleep(500)
Reload()
}
#HotIf 网瘾少年徐志摩 发表于 2024-2-21 14:03
应该是getKeyStates和sendinput钩子冲突问题导致的,send默认是使用sendinput的
好像还真是因为sendInput的问题。
我一开始换成sendPlay,但是打不出字,发送左键也无效。
后来换成sendEvent,使用了半个小时了,没有问题。
页:
[1]