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

如何在AutoHotkey中快速检测是否有文本被选中?

AutoHotkey 文本选中检测优化方案

问题描述

我需要在AutoHotkey中检测是否有文本被选中,目前使用以下可正常运行但速度较慢的函数:

IsTextSelected()
{
    SavedClip := ClipboardAll()
    A_Clipboard := ""
    Send("^c")
    Errorlevel := !ClipWait(0.5) ; Wait for the clipboard to contain data
    if (!ErrorLevel) ; There is data on clipboard
        return (true)
    else
        return (false)
    ; Sleep(100)
    A_Clipboard := SavedClip
    SavedClip := ""
    return
}

请问是否有方法加快检测速度,或其他实现思路?

优化方案

一、改进原剪贴板方法(快速修复)

原函数的延迟主要来自ClipWait(0.5)的过长等待时间,还存在剪贴板未恢复的逻辑bug(return语句会跳过剪贴板恢复代码)。优化点:

  • 缩短ClipWait等待时长至0.1(100ms),多数程序的复制操作都能在该时间内完成
  • 调整剪贴板恢复逻辑,确保无论检测结果如何,都能还原原剪贴板内容

优化后代码:

IsTextSelected()
{
    SavedClip := ClipboardAll()
    A_Clipboard := ""
    Send("^c")
    ; 缩短等待窗口,直接获取检测结果
    hasSelection := !ClipWait(0.1)
    ; 立即恢复剪贴板,避免占用系统资源
    A_Clipboard := SavedClip
    SavedClip := ""
    return hasSelection
}

二、使用Windows API直接检测(性能最优)

通过调用系统API直接获取控件的选中状态,无需操作剪贴板,速度大幅提升。该方法针对不同控件类型做适配,兼容性更强:

IsTextSelected()
{
    ; 获取当前活动窗口的焦点控件句柄
    WinGetActiveStats, WinTitle
    ControlGetFocus, FocusedControl, %WinTitle%
    ControlGet, hCtrl, Hwnd,, %FocusedControl%, %WinTitle%

    ; 调用GetGUIThreadInfo获取焦点控件信息
    VarSetCapacity(GUIThreadInfo, 60, 0)
    NumPut(60, GUIThreadInfo, 0, "UInt") ; 设置结构大小
    DllCall("GetGUIThreadInfo", "UInt", 0, "Ptr", &GUIThreadInfo)
    hFocused := NumGet(GUIThreadInfo, 4, "Ptr")

    ; 针对编辑类控件(Edit/RichEdit)直接获取选中范围
    if (hFocused = hCtrl)
    {
        ; 发送EM_GETSEL消息获取选中起始/结束位置
        SendMessage, 0xB0, 0, 0,, ahk_id %hCtrl% ; EM_GETSEL = 0xB0
        startPos := ErrorLevel & 0xFFFF
        endPos := ErrorLevel >> 16
        return (startPos != endPos) ; 起止位置不同则表示有文本选中
    }

    ; 针对浏览器、Office等复杂控件,用WM_COPY快速检测
    SavedClip := ClipboardAll()
    A_Clipboard := ""
    SendMessage, 0x301, 0, 0,, ahk_id %hCtrl% ; WM_COPY = 0x301
    hasSelection := !ClipWait(0.05)
    A_Clipboard := SavedClip
    SavedClip := ""
    return hasSelection
}

方案对比

  • 改进后的剪贴板方法:简单易改,修复了原函数的bug,速度显著提升,适合快速迭代场景
  • API检测方法:无剪贴板操作开销,速度最快,兼容性强,适合对性能要求高的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:57:25