You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:如何用Autoit编写代码检测键盘的Single/Double/Long Key Press?

使用AutoIt检测单键按下、双击及长按操作

AutoIt本身没有原生的双击或长按检测API,我们可以通过结合_IsPressed()函数与计时器逻辑,实现对这三种键盘操作的区分。以下是完整的实现思路和示例代码:

核心逻辑说明

  • 单键按下:按键被按下一次,且未在双击间隔内触发第二次按下,也未达到长按阈值
  • 双击:在设定的时间间隔内(比如500ms),同一按键被连续按下两次,且两次按下之间按键已释放
  • 长按:按键被按下后持续按住超过设定的阈值时间(比如1000ms)

完整示例代码

#include <AutoItConstants.au3>

; 配置参数:可根据需求调整
Local $dClickInterval = 500 ; 双击判定的时间间隔(毫秒)
Local $longPressThreshold = 1000 ; 长按判定的阈值时间(毫秒)

; 状态变量
Local $lastKeyPressTime = 0
Local $keyPressedOnce = False
Local $keyHeld = False
Local $targetKey = 0x41 ; 检测的目标按键:这里是A键(十六进制扫描码,可替换为其他按键)

While 1
    Sleep(10) ; 降低CPU占用
    
    ; 检测按键是否被按下
    If _IsPressed($targetKey) Then
        If Not $keyHeld Then
            ; 首次按下按键
            $keyHeld = True
            Local $currentTime = TimerInit()
            
            If $keyPressedOnce Then
                ; 两次按下间隔在双击阈值内,判定为双击
                If ($currentTime - $lastKeyPressTime) < $dClickInterval Then
                    ConsoleWrite("检测到Double Key Press(双击)" & @CRLF)
                    $keyPressedOnce = False ; 重置双击状态
                EndIf
            Else
                ; 记录第一次按下的时间
                $lastKeyPressTime = $currentTime
                $keyPressedOnce = True
                
                ; 启动长按检测线程
                _CheckLongPress($targetKey, $longPressThreshold)
            EndIf
        EndIf
    Else
        ; 按键释放
        If $keyHeld Then
            $keyHeld = False
            ; 检查是否是单键按下(未触发双击和长按)
            If $keyPressedOnce Then
                Local $currentTime = TimerInit()
                If ($currentTime - $lastKeyPressTime) >= $dClickInterval Then
                    ConsoleWrite("检测到Single Key Press(单按)" & @CRLF)
                    $keyPressedOnce = False
                EndIf
            EndIf
        EndIf
    EndIf
WEnd

; 长按检测函数
Func _CheckLongPress($key, $threshold)
    Sleep($threshold)
    ; 等待阈值时间后,检查按键是否仍被按住
    If _IsPressed($key) Then
        ConsoleWrite("检测到Long Key Press(长按)" & @CRLF)
        $keyPressedOnce = False ; 重置状态,避免触发单按/双击
    EndIf
EndFunc

代码说明

  1. 参数配置:你可以修改$dClickInterval调整双击的灵敏度,修改$longPressThreshold调整长按的判定时长
  2. 目标按键:$targetKey是按键的十六进制扫描码,比如A键是0x41,你可以通过查阅键盘扫描码表替换为其他按键
  3. 状态变量:通过$keyPressedOnce、$keyHeld等变量跟踪按键的状态,精准区分三种操作
  4. 长按检测:使用独立函数延迟检查,确保按键持续按住超过阈值后才判定为长按

测试方法

运行脚本后,打开AutoIt编辑器的控制台(查看->控制台),按下A键测试三种操作:

  • 快速连续按两次:控制台输出双击提示
  • 按住超过1秒再释放:控制台输出长按提示
  • 按一次后等待超过500ms再释放:控制台输出单按提示

内容的提问来源于stack exchange,提问作者SharkyEXE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:12:30