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

AutoHotKey鼠标中键粘贴在WSL终端首点输出^C的解决求助

解决首次点击终端输出^C的问题

这个问题大概率是脚本在终端窗口首次激活/点击时,误触发了模拟Ctrl+C的操作。可以通过以下两种方式修复:

方案1:增加窗口激活判断,避免首次触发

在脚本的选中复制逻辑前,先检查窗口是否是刚刚激活的,跳过首次点击的误触发:

; 记录上次激活的窗口ID
lastWinID := 0

~LButton Up::
    WinGet, currentWinID, ID, A
    ; 如果是新激活的窗口,直接返回,不执行复制逻辑
    if (currentWinID != lastWinID) {
        lastWinID := currentWinID
        return
    }
    ; 原有的选中复制逻辑
    if (A_Cursor = "IBeam") {
        Send, ^c
    }
return

方案2:仅当有选中文本时才执行复制

通过ClipboardAll对比,确保只有选中文本时才触发Ctrl+C,避免空触发:

~LButton Up::
    ClipboardBackup := ClipboardAll
    Send, ^c
    Sleep, 50
    ; 如果剪贴板没有变化,说明没有选中文本,恢复原剪贴板
    if (Clipboard = ClipboardBackup) {
        Clipboard := ClipboardBackup
        return
    }
return

适配AutoHotKey v2版本的脚本

以下是实现选中即复制+鼠标中键粘贴的AHK v2版本,同时解决了首次点击输出^C的问题:

; 记录上次激活的窗口ID
lastWinID := 0

; 左键松开时,判断是否选中文本并复制
~LButton Up:: {
    global lastWinID
    currentWinID := WinGetID("A")
    ; 跳过窗口首次激活的点击
    if (currentWinID != lastWinID) {
        lastWinID := currentWinID
        return
    }
    ; 仅当光标为IBeam(文本光标)时执行复制
    if (CursorGetName() = "IBeam") {
        ClipboardBackup := ClipboardAll()
        Send "^c"
        Sleep(50)
        ; 无选中文本则恢复剪贴板
        if (Clipboard = ClipboardBackup) {
            Clipboard := ClipboardBackup
        }
    }
}

; 鼠标中键粘贴
MButton:: {
    ; 仅在终端类窗口中生效(可根据需要调整窗口标题/类名)
    WinTitle := "ahk_exe WindowsTerminal.exe" " ahk_exe powershell.exe" " ahk_exe wsl.exe"
    if WinActive(WinTitle) {
        Send "^v"
    } else {
        ; 非终端窗口保留原中键功能
        Send "{MButton}"
    }
}

v2版本的关键改动说明:

  • 函数定义使用{}包裹代码块
  • 全局变量需要用global声明
  • 原v1的命令(如WinGet、ClipboardAll)改为v2的函数形式(WinGetID()、ClipboardAll())
  • 条件判断和语法更贴近现代编程语言
  • 可以更精准地指定生效的窗口(通过WinTitle过滤终端程序)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:55:07