2个剪贴板ahk脚本

2 clipboards ahk script

我正在尝试使用 ahk 脚本创建 2 个(或更多)剪贴板。

期望的行为是使用标准 ^v 加 !v,所以它将是 2 个剪贴板。 ^v 是普通的,!v 将是 ^v 之前的内容。

如果我将 'text1' 复制到剪贴板,我会将其作为 ^v。如果我复制 'text2',我将在剪贴板上使用 ^v 得到 'text2',加上旧的 'text1' 可以使用 !v,等等。

到目前为止:

lastclip = %clipboard%

!v::
                global lastclip
                sendclip(lastclip)
return

ClipWaitChange()

ClipWaitChange()
{
  While changed=0 {
    global lastclip
    lastclip = %clipboard%
    Sleep 10
  }
  OnClipboardChange:
    changed = 1
    return
}

但它 returns 一个空白的剪贴板或者 ^v 可能停止工作。

有什么提示吗?

sendclip 只是一个通过键盘发送剪贴板内容的自定义函数

我尝试将 lastclip = %clipboard% 放在 onclipboardchange 中,但它会复制当前更改的剪贴板,因此必须在此之前完成。

我假设你的问题是学术性质的。如果没有,我推荐其中一个已有的剪贴板管理器。

这是一个带有评论的解决方案:

lastClip := ""
bufferedClip := Clipboard

OnClipboardChange("clipChangeHandler")

; Note that the ALT key can change focus, better use WIN+V
#v::
    ; Since we temporarily switch Clipboard's contents,
    ; we want to ignore the event it will fire
    OnClipboardChange("clipChangeHandler", 0)
    ; I recommend pasting rather than sending
    tmpClip := Clipboard
    Clipboard := lastClip
    Send, ^v
    Clipboard := tmpClip
    tmpClip := ""
    OnClipboardChange("clipChangeHandler")
return

clipChangeHandler(evtInfo) {
    global lastClip, bufferedClip
    ; Check if Clipboard contains actual text
    if(evtInfo  = 1) {
        lastClip := bufferedClip
        bufferedClip := Clipboard
    }
}

另见 OnClipboardChange in AHK docs

几点说明:

  • 事件函数检查事件类型是否为(部分)真实文本,忽略纯非文本,如图像和空剪贴板
  • clipBuffer 始终存储当前剪贴板,而 lastClip 包含上一个剪贴板。您需要缓冲区变量,因为该事件不提供类似 previous clipboard
  • 的内容
  • ALT + v 在使用具有经典菜单栏的 windows 时可能会出现问题。按 ALT(甚至在释放之前)通常会将焦点从当前控件上移开。
  • 我建议粘贴而不是发送。例如。当剪贴板中有数千个单词的大文本时(甚至可能由另一个程序放在那里或者只是错误地放在那里),一个一个地发送每个字符可能会花费很长时间,甚至可能会带来其他副作用。如果你想 Send 无论如何,至少使用 SendRaw 这样某些字符就不会被误认为是控制序列(例如发送 #e 将打开 Windows 资源管理器)。
  • 始终考虑应用程序的安全方面。如果您(例如我们的密码保险箱)清空剪贴板以删除敏感数据,您的脚本仍将保留一份(未加密的)副本,供其他进程查看。