使用Sleep语句无需人为延迟的剪贴板操作

时间:2017-09-02 10:13:16

标签: clipboard autohotkey copy-paste

我创建了简单的宏来交换剪贴板内容和当前选择。但是当我删除Sleep命令时它停止正常工作:它没有完成剪贴板操作。试试没有这些命令就能看出我的意思。

但是Sleep命令更像是一个黑客而不是一个正确的解决方案。如果500毫秒太长 - 或者在某些情况下 - 等待的时间太短会怎么样?

请问,在没有Sleep表彰的情况下,正确使用AutoHotKey的方法是什么?

^CapsLock::
    ClipboardOld=%ClipboardAll%
    Send ^c
    Sleep 500
    ClipWait
    ClipboardNew=%ClipboardAll%
    Sleep 500
    Clipboard=%ClipboardOld%
    Sleep 500
    ClipboardOld=  ;clear global variable to conserve memory
    Send ^v
    Sleep 500
    Clipboard=%ClipboardNew%
    Sleep 500
    ClipboardNew=  ;clear global variable to conserve memory
    Return

1 个答案:

答案 0 :(得分:1)

我从您的代码中删除了sleep语句,但只能在选择和剪贴板数据相对较大时重现问题,例如图片数据。

我对您的代码进行了两处更改:

此交换剪贴板和选择

^CapsLock::
    tooltip loading clipboard
    ClipboardOld := ClipboardAll
    clipboard=                      ; makes ClipWait wait for NEW clipboard
    Send ^c
    ClipWait 30,1                   ; "1" watches for both text and binary data
    tooltip swapping clipboard
    ClipboardNew := ClipboardAll
    Clipboard := ClipboardOld
    ClipboardOld=
    Send ^v
    Clipboard := ClipboardNew
    ClipboardNew=
    tooltip
    return

如果此代码仍无效,我建议尝试确定哪些睡眠语句是使代码正常工作所必需的。通过删除一半的睡眠陈述并进行测试,直到找到所需的陈述,使用分而治之的方法和消除过程。

更新:这会尝试解决评论部分中描述的问题:

^CapsLock::
    tooltip loading clipboard
    ClipboardOld := ClipboardAll
    clipboard=
    Send ^c
    ClipWait 30,1
    tooltip swapping clipboard
    ClipboardNew := ClipboardAll
    Clipboard=                   ; reset clipboard to enable ClipWait
    Clipboard := ClipboardOld
    ClipWait 30,1
    ClipboardOld=

    Send ^v
    Clipboard=                   ; reset clipboard to enable ClipWait
    Clipboard := ClipboardNew
    ClipWait 30,1                ; Wait for clipboard to restore
    ClipboardNew=
    tooltip
    return