2个剪贴板ahk脚本

时间:2016-06-23 17:02:23

标签: clipboard autohotkey

我试图拥有2个剪贴板(或更多),带有ahk脚本。

所需的行为正在使用标准^ v plus!v,因此它将是2个剪贴板。 ^ v是通常的一个,!v将是^ v之前的内容。

如果我复制' text1'在剪贴板上,我会将此作为^ v。如果我复制' text2'我会有' text2'在^ v的剪贴板上,再加上旧的' 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
}

但是它会返回一个空白的剪贴板,或者^ v停止工作。

任何提示如何做到这一点?

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

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

1 个答案:

答案 0 :(得分:1)

我认为你的问题属于学术性质。如果没有,我建议已经有很多剪贴板管理器中的一个。

这是一个带注释的解决方案:

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包含以前的剪贴板。您需要缓冲区变量,因为该事件不提供类似以前的剪贴板
  • 的内容
  • 使用具有经典菜单栏的窗口时,ALT + v可能会出现问题。击中ALT(即使在释放它之前)通常会将焦点从当前控件上移开。
  • 我建议粘贴而不是发送。例如。当剪贴板中有大量文字时,有数千个单词(甚至可能被其他程序放在那里或者只是错误),逐个发送每个字符可能需要很长时间,甚至可能带来其他副作用。如果您想Send,请至少使用SendRaw,以便某些字符不会被视为控制序列(例如,发送#e将打开Windows资源管理器。)
  • 始终考虑应用程序的安全性方面。如果您(我们的密码安全,例如)清空您的剪贴板以删除敏感数据,您的脚本仍将保留(未加密)的副本,以便查看其他每个进程。