2017-09-02 67 views
0

我创建了简单的宏来交换剪贴板内容与当前选择。但是,当我删除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

我删除了睡眠语句从您的代码,但在选择和剪贴板数据是比较大的,只能重现的问题,像图像数据。

我做了两个修改了代码:

这种交换剪贴板和选择

^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 
+0

谢谢你的回答。我可以确定哪些睡眠语句是必要的(正如您所说,问题与大数据或高CPU负载有关),但是我的问题是在保持代码可靠工作的同时是否可以完全忽略它们,因为我想了解原理。 AutoHotKey能否可靠地使用剪贴板工作,而无需使用Sleep语句的解决方法? (顺便说一下,我发现在样式'变量=%ClipoardAll%'中的赋值是问题的一部分。剪贴板备份的正确形式是'variable:= ClipoardAll',它的行为也不同。) – miroxlav

+0

我发布的答案没有使用sleep语句,对我来说可靠地工作。如果你想支持任意大的剪贴板内容,我建议增加ClipWait并使用工具提示让用户知道发生了什么。 –

+0

我再次感谢您的这些改进。我提出了答案,但我现在不会将其标记为接受,因为它没有解除需要“睡眠”陈述的魔力。如果我使用你的代码,它将不可靠地工作,直到我在'Send^v'前后插入'Sleep'。所以具有“睡眠”的魔法似乎仍然是稳定的必要条件。没有“睡眠”的方式是否仍然存在。如果您写作AutoHotKey专家,除了使用“睡眠”之外没有其他办法,我会接受答案。 – miroxlav