使用剪贴板检查巨集何时完成

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,

以上是关于使用剪贴板检查巨集何时完成的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 HealthKit 功能何时完成(Swift)

检查多个异步网络操作何时完成

为啥使用片段,以及何时使用片段而不是活动?

如何知道何时调用了`navController.popBackStack()`?

是否扩展接口,何时基类已经扩展了相同的接口

如何知道片段何时在 viewpager 中实际可见