【问题标题】:2 clipboards ahk script2 个剪贴板 ahk 脚本
【发布时间】:2016-10-26 03:33:00
【问题描述】:

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

所需的行为是使用标准的 ^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
}

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

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

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

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

【问题讨论】:

  • 有些事情我不清楚:1) While changed=0 { 的右括号在哪里? 2) 如果您已经有了方便的“事件”OnClipboardChange,为什么还要首先创建一个等待循环? 3) 你说的是^v,它是CTRL+v。在您的代码中,您定义了!v,即 ALT+v。我们在谈论哪个热键?请准确描述您希望在哪个事件或用户操作上发生什么,以及您希望如何分别写入和读取 2 个剪贴板。
  • 我想我需要一段时间来不断检查/粘贴当前的剪贴板。我正在更新描述

标签: clipboard autohotkey


【解决方案1】:

我认为您的问题属于学术性质。如果没有,我推荐已经存在的众多剪贴板管理器之一。

这是一个使用 cmets 的解决方案:

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

【讨论】:

  • 这是一个很好解释的答案。长话短说,想要一台我可以运行 ahk 但不能安装应用程序的 pc --- 我不明白为什么需要 bufferedclip 如果你做的事情等于:lastClip := bufferedClip := Clipboard 这似乎只是移动那个日期2个变量。我测试了直接做lastClip := Clipboard,确认它不起作用。我不明白。 --- 我注意到发送键对于长文本来说太慢了,函数 sendclip() 在它内部发送 ^v,只是不在代码示例中。 tyvm
  • 哦,好吧,愚蠢的我,bufferedClip它是一个全局变量,存储最后一次运行。这样的阅读障碍。非常感谢。哇。
  • @Cristo 正确,bufferedClip 始终存储当前剪贴板。如果剪贴板被更改,lastClip 将获得bufferedClip 的内容。如果我们不保留剪贴板的副本,我们将不会在它更改后立即知道它的内容。如果您可以执行 ahk,您不能只执行便携式剪贴板管理器(不必安装)。但是 AHK 中的 eben 已经有许多现有的剪贴板管理器可用,包括它们的源代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多