AHK 里用剪贴板做自动化非常常见:复制选中文本、读取网页内容、向 Excel 粘贴数据、批量处理文本。但剪贴板也是新手最容易踩坑的地方:^c 后立刻读不到内容,脚本覆盖了用户原来的剪贴板,粘贴时还是旧内容,或者复制图片和文本混在一起。
一、为什么 Ctrl+C 后不能立刻读 Clipboard
复制不是瞬间完成的。你发送 ^c 后,目标程序需要一点时间把数据放进剪贴板。如果立刻读取 Clipboard,很可能读到旧内容。
#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
Clipboard := ""
SendInput, ^c
ClipWait, 1
if ErrorLevel {
MsgBox, 复制超时,剪贴板没有得到文本。
return
}
MsgBox, % Clipboard
ClipWait 的作用是等待剪贴板出现内容。做复制读取时,它比固定 Sleep 更可靠。
二、操作前备份,操作后恢复
脚本如果直接改剪贴板,用户原来复制的内容就没了。比较礼貌的做法是先备份,再恢复。
ClipSaved := ClipboardAll
Clipboard := ""
SendInput, ^c
ClipWait, 1
if !ErrorLevel {
text := Clipboard
MsgBox, % "复制到的文本:" text
}
Clipboard := ClipSaved
ClipSaved := ""
return
ClipboardAll 可以保存更完整的剪贴板内容,包括图片、格式化文本等。恢复后把备份变量清空,可以释放内存。
三、粘贴前也要等剪贴板就绪
不只是复制需要等,给剪贴板赋值后再粘贴,也建议稍微等一下,尤其是大文本、富文本、Excel 表格数据。
ClipSaved := ClipboardAll
Clipboard := ""
Clipboard := "第一行`t第二列`r`n第二行`t第二列"
ClipWait, 1
if !ErrorLevel
SendInput, ^v
Sleep, 100
Clipboard := ClipSaved
ClipSaved := ""
向 Excel、网页编辑器、聊天窗口粘贴时,目标程序也需要处理时间。粘贴后立刻恢复剪贴板,可能导致目标还没取完内容。必要时在粘贴后加一个短延迟。
四、封装成函数更安全
CopyText(timeout := 1) {
ClipSaved := ClipboardAll
Clipboard := ""
SendInput, ^c
ClipWait, %timeout%
if ErrorLevel {
Clipboard := ClipSaved
ClipSaved := ""
return ""
}
text := Clipboard
Clipboard := ClipSaved
ClipSaved := ""
return text
}
把复制流程封装起来,后面热键里就不会到处重复写清空、等待、恢复。脚本越大,这种封装越值得。
五、常见坑点
Send, ^c后马上读剪贴板,读到旧内容。- 复制前没有清空剪贴板,导致
ClipWait误以为复制成功。 - 脚本覆盖用户剪贴板,没有备份恢复。
- 粘贴大文本后立刻恢复剪贴板,目标程序还没取完内容。
- 目标窗口没有激活,
^c发到了错误窗口。 - 某些程序禁止复制,或者复制的是图片/富文本,不是普通文本。
六、推荐流程
- 保存
ClipboardAll。 - 清空
Clipboard。 - 发送复制或写入新内容。
- 用
ClipWait等待。 - 读取或粘贴。
- 必要时短暂延迟。
- 恢复原剪贴板。
剪贴板自动化不是不能用,而是要把“等待”和“恢复”当成固定步骤。只要这两点做好,复制粘贴类脚本会稳定很多。
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)