Тема: AHK: работа с консольными утилитами и командами
Необходима универсальная функция для всех версий ahk (a32, u32, u64), которая бы позволяла последовательно выполнять одну или несколько консольных команд или утилит и получать их StdOut (или если он пуст, то - StdErr) в переменную, причём так, чтобы окно консоли не появлялось ни на долю секунды.
В файле справки на странице о команде run есть такой код:
RunWaitMany(commands) {
shell := ComObjCreate("WScript.Shell")
; Open cmd.exe with echoing of commands disabled
exec := shell.Exec(ComSpec " /Q /K echo off")
; Send the commands to execute, separated by newline
exec.StdIn.WriteLine(commands "`nexit") ; Always exit at the end!
; Read and return the output of all commands
return exec.StdOut.ReadAll()
}
Но с ним появляется окно консоли.
Товарищ с irc-канала дал такой код:
RunWaitOne(command) {
WinGet,pid,pid,ahk_id%A_ScriptHwnd%
DetectHiddenWindows, on
Run,%comspec% /k,,Hide UseErrorLevel, cPid
WinWait, ahk_pid %cPid%,,10
DllCall("AttachConsole","uint",cPid),hCon:=DllCall("CreateFile","str","CONOUT$","uint",0xC0000000,"uint",7,"uint",0,"uint",3,"uint",0,"uint",0),shell:=ComObjCreate("WScript.Shell"),exec:=shell.Exec(command),DllCall("CloseHandle","uint",hCon),DllCall("FreeConsole")
if(info:=exec.Stderr.ReadAll()){
return info
}else{
return exec.stdout.ReadAll()
}
}
Но он у меня (на u64) выдаёт ошибку (это даже если код не менять, ведь он заточен под выполнение только одной команды, а не нескольких).
Пробовал искать по ключевому запросу "autohotkey DllCall AttachConsole" - и нашёлся код с этого форума где используется
DllCall("AttachConsole", "Ptr"
вместо
DllCall("AttachConsole","UInt"
, в другом месте нашёлся вариант и такой вариант использования:
DllCall("AttachConsole", "UInt", cPID, "Cdecl int")
, а где-то и такой:
DllCall("AttachConsole", int, -1, int)
, а ещё есть вариант от самого lexikos'а, но там код старый и уж больно много его.
Другими словами - я окончательно запутался и хочу один рабочий код.
Умеющие транслировать WinAPI в DllCallы - подсобите, пожалуйста.