使用剪贴板检查巨集何时完成
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用剪贴板检查巨集何时完成相关的知识,希望对你有一定的参考价值。
我从一个AutoHotKey脚本启动一个Excel宏,然后等待它使用剪贴板完成。Excel宏以一行将k放入剪贴板结束。
With New MSForms.DataObject
.SetText k
.PutInClipboard
End With
然后自动热键脚本有一行:
Loop {
} Until clipboard = "k"
当excel宏完成后,它会把k放入剪贴板,然后autohotkey会检测到这一点,并继续执行脚本。但问题是,它没有工作。我得到一个错误信息说Excel不能使用剪贴板。它被另一个应用程序使用了,我猜是autohotkey。
有什么办法解决这个问题吗?或者有其他方法让脚本和宏相互对话吗?我想从一个autohotkey脚本中启动宏,然后等待宏完成后再恢复脚本。这就是自动热键脚本。
^!a::
OrdersLeftToPick:
click 400, 460
clipwait, 70
sleep, 1000
click 8, 2400
sleep, 100
send ^k ;Ctrl + K, starts the macro
loop {
} until clipboard = "k" ;wait until "k" is in the clipboard then resume the script
sleep, 1000
goto OrdersLeftToPick
答案
你应该看看AHK帮助 "运行 "页面上的倒数第二个例子,它解释了如何使用WScript.Shell.Exec来做一些可能有帮助的事情(返回带有结果的stdout,例如 "Done "到你的ahk脚本)。https:/www.autohotkey.comdocscommandsRun.htm#StdOut
下面是一个实施方案。
;// The following runs a command (add.vbs but could be an excel macro, too)
;// and retrieves its output (could be a message, e.g., "Done", too) via StdOut:
InputBox, x,,Enter two integer numbers ;// two numbers to add
MsgBox % """" RunWaitOne("add.vbs " x) """" ;// returns, via stdout, the result in quotes
ExitApp
RunWaitOne(command)
{
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec(ComSpec " /C cscript " command)
return Substr(exec.StdOut.ReadAll(), 109) ;// remove 109 characters in WScript header
}
/* "add.vbs" This is the external command:
a=33 ' some defauls
b=4
if WScript.Arguments.Count > 0 Then
a=cint(WScript.Arguments.Item(0))
b=cint(WScript.Arguments.Item(1))
End If
x=a+b ' result (or, x="Done")
' This is how to get the result back:
Dim StdOut : Set StdOut = CreateObject("Scripting.FileSystemObject").GetStandardStream(1)
StdOut.Write x
*/
Hth,
以上是关于使用剪贴板检查巨集何时完成的主要内容,如果未能解决你的问题,请参考以下文章