我试图拥有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中,但它会复制当前更改的剪贴板,因此必须在此之前完成。
答案 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
包含以前的剪贴板。您需要缓冲区变量,因为该事件不提供类似以前的剪贴板 Send
,请至少使用SendRaw
,以便某些字符不会被视为控制序列(例如,发送#e
将打开Windows资源管理器。)