использование буфера обмена для проверки завершения макроса - PullRequest
0 голосов
/ 16 апреля 2020

Я запускаю макрос Excel из скрипта AutoHotKey, а затем жду, пока он завершится sh с использованием буфера обмена. Макрос Excel заканчивается строкой, которая помещает k в буфер обмена:

With New MSForms.DataObject
    .SetText k
    .PutInClipboard
End With

В этом сценарии autohotkey есть строка:

Loop {
} Until clipboard = "k"

, которая выполняется во время работы макроса. Когда макрос excel завершен, он помещает k в буфер обмена, и autohotkey обнаруживает это и продолжает работу со сценарием. Дело в том, что это не работает. Я получаю сообщение об ошибке, что Excel не может использовать буфер обмена. Он используется другим приложением, которое, я думаю, является autohotkey.

Есть ли способ решить эту проблему? Или есть другой способ, чтобы скрипт и макрос говорили друг с другом? Я хочу запустить макрос из скрипта autohotkey, а затем дождаться окончания макроса sh, прежде чем возобновить работу скрипта. Это скрипт 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

1 Ответ

0 голосов
/ 25 апреля 2020

Обратите внимание на предпоследний пример на странице «Выполнить» справки AHK, в котором объясняется, как использовать WScript.Shell.Exe c для выполнения действий, которые могут помочь (вернуть стандартный вывод с результатом, например «Готово»). на ваш ахк сценарий). https://www.autohotkey.com/docs/commands/Run.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,

...