吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1150|回复: 8
收起左侧

[已解决] 【AHK】【脚本】setTimer和getKeyStates的问题

 关闭 [复制链接]
iLouis 发表于 2024-2-20 17:08
本帖最后由 iLouis 于 2024-2-21 16:03 编辑

很多游戏要疯狂点击鼠标,我就想着搞一个和DNF的连发一样,按下就等于不停点,松开就等于不点了的脚本,解约鼠标寿命,也方便操作。

[Plain Text] 纯文本查看 复制代码
LButtonLabel() {
    Send({LButton})
    return
}
XButton1::{
    SetTimer(LButtonLabel, 50)
}
XButton1 up::{
    SetTimer(LButtonLabel, 0)
}


后来发现会出现BUG。
一、点击的速度不正常。
二、松开侧键还是在点(有时)。
就变成了

[Plain Text] 纯文本查看 复制代码
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连发。但是我早已不玩,所以用记事本测试。

[Plain Text] 纯文本查看 复制代码
#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。
所以请问下,有没有解决方案。多谢。




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
zl1312 发表于 2024-2-21 11:57
毒奶粉连发,以前做过,现在早都不玩了
微信截图_20240221115738.jpg
wapjsx 发表于 2024-2-21 11:59
zl1312 发表于 2024-2-21 11:57
毒奶粉连发,以前做过,现在早都不玩了

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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
iLouis + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| iLouis 发表于 2024-2-21 15:22
lysuro 发表于 2024-2-21 01:29
;F12为总开关,默认运行即开启疯狂按键模式,按F12一次为关闭,再按F12一次又为开启,交替循环。
#SingleI ...

一样的,时不时会出现已经松开了按键,但是依旧在跑的情况,getKeyState('x', 'P')的返回值是1。
[Plain Text] 纯文本查看 复制代码
#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,使用了半个小时了,没有问题。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 16:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表