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 资源管理器)。
- 始终考虑应用程序的安全方面。如果您(例如我们的密码保险箱)清空剪贴板以删除敏感数据,您的脚本仍将保留一份(未加密的)副本,供其他进程查看。
我正在尝试使用 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 资源管理器)。 - 始终考虑应用程序的安全方面。如果您(例如我们的密码保险箱)清空剪贴板以删除敏感数据,您的脚本仍将保留一份(未加密的)副本,供其他进程查看。