iLouis 发表于 2024-2-20 17:08

【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:29

本帖最后由 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

lysuro 发表于 2024-2-21 01:47

;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

arg10 发表于 2024-2-21 11:55

终于有人用ahk了

zl1312 发表于 2024-2-21 11:57

毒奶粉连发,以前做过,现在早都不玩了

wapjsx 发表于 2024-2-21 11:59

zl1312 发表于 2024-2-21 11:57
毒奶粉连发,以前做过,现在早都不玩了

牛牛牛~~~

网瘾少年徐志摩 发表于 2024-2-21 14:03

应该是getKeyStates和sendinput钩子冲突问题导致的,send默认是使用sendinput的

iLouis 发表于 2024-2-21 15:22

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

iLouis 发表于 2024-2-21 15:50

网瘾少年徐志摩 发表于 2024-2-21 14:03
应该是getKeyStates和sendinput钩子冲突问题导致的,send默认是使用sendinput的

好像还真是因为sendInput的问题。
我一开始换成sendPlay,但是打不出字,发送左键也无效。
后来换成sendEvent,使用了半个小时了,没有问题。
页: [1]
查看完整版本: 【AHK】【脚本】setTimer和getKeyStates的问题