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
相关产品推荐
相关产品推荐

