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
,您可能需要在那里睡眠,因为剪贴板分配可能会破坏未完成的粘贴操作。我不知道有什么方法可以检测粘贴完成的时间。