Clipboard 使用Sleep语句执行剪贴板操作,无需人为延迟

Clipboard 使用Sleep语句执行剪贴板操作,无需人为延迟,clipboard,autohotkey,copy-paste,Clipboard,Autohotkey,Copy Paste,我创建了一个简单的宏来交换剪贴板内容和当前选择。但当我删除Sleep命令时,它会停止正常工作:它不会完成剪贴板操作。试着不用这些命令,看看我的意思 但是Sleep命令与其说是一个合适的解决方案,不如说是一种黑客行为。如果500毫秒太长——或者在某些情况下——等待的时间太短怎么办 请问,在无需睡眠的情况下,如何使用自动热键使其正常工作? ^CapsLock:: ClipboardOld=%ClipboardAll% Send ^c Sleep 500 ClipWai

我创建了一个简单的宏来交换剪贴板内容和当前选择。但当我删除
Sleep
命令时,它会停止正常工作:它不会完成剪贴板操作。试着不用这些命令,看看我的意思

但是
Sleep
命令与其说是一个合适的解决方案,不如说是一种黑客行为。如果500毫秒太长——或者在某些情况下——等待的时间太短怎么办

请问,在无需
睡眠的情况下,如何使用自动热键使其正常工作?

^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

我从代码中删除了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
如果这段代码仍然不起作用,我建议尝试确定哪些sleep语句是使代码正常工作所必需的。使用分而治之的方法和消除过程,删除一半的sleep语句并进行测试,直到找到需要的语句

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

^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

谢谢你的回答。我可以确定哪些Sleep语句是必需的(正如您所说,这个问题与大数据或高CPU负载有关),但我的问题是,在保持代码可靠工作的同时,是否可以完全忽略它们,因为我想了解其原理。自动热键是否可以在不使用Sleep语句的情况下可靠地使用剪贴板?(顺便说一句,我发现
变量=%ClipoardAll%
形式的赋值是问题的一部分。剪贴板备份的正确形式是
变量:=ClipoardAll
,这也有不同的作用。)我发布的答案没有使用睡眠语句,对我来说工作可靠。如果你想支持任意大的剪贴板内容,我建议增加ClipWait并使用工具提示让用户知道发生了什么。再次感谢你的这些改进。我对答案投了更高的票,但我目前不会将其标记为接受,因为它并没有消除需要
睡眠
语句的魔力。如果我使用您的代码,它将不可靠地工作,直到在
Send ^v
之前和之后插入
Sleep
。因此,
睡眠
的魔力似乎仍然是稳定性所必需的。有没有办法不睡觉的问题仍然悬而未决。如果你以自动热键专家的身份写下除了使用
睡眠
,没有其他方法,我会接受答案。我不是专家。我用更多的clipwait更新了我的答案,这可能会有所帮助,但由于我无法重现你的问题,我不知道它们是否会有所帮助。特别是,我想知道是
ClipboardNew1:=ClipboardNew1
语句不起作用,还是
Send^v
语句不起作用。如果是
发送^v
,您可能需要在那里睡眠,因为剪贴板分配可能会破坏未完成的粘贴操作。我不知道有什么方法可以检测粘贴完成的时间。