Certo, bom, se nenhuma das opções do comando Run não está funcionando a contento, creio que vamos ter que procurar um
. Felizmente a programação Windows parece ser farta de opções nesse sentido.
Se entendi direito, o problema é a tela do console abrindo por uma fração de segundo certo? Tem uma função antiga escrita por alguns usuários (Sean, nfl, cyruz) que pode executar linhas de comando de forma oculta (e que retorna o texto do console caso queira consultar).
Aqui vai um exemplo: Execute o código abaixo e pressione a tecla F4 para fazer o comando do console executar de maneira oculta através de DllCall()s. (OBS: no código abaixo a msgbox com o resultado do ping está sendo exibida somente para ver que foi executado, você não precisa dessa linha, pode deixar o comando executar oculto mesmo. Removendo a linha do msgbox, verá que o foco da janela atual não será perdido após a execução da função, nem mesmo por uma fração de segundo).
Code: Select all
F2::
Run, %ComSpec% /c ping 192.168.0.1,, HIDE
Return
F3::
Run, %ComSpec% /c ping 192.168.0.1
WinWaitActive, ahk_class ConsoleWindowClass
WinMinimize, ahk_class ConsoleWindowClass
Return
f4::
Var := StdoutToVar_CreateProcess("ping 192.168.0.1")
msgbox % Var
Return
; ----------------------------------------------------------------------------------------------------------------------
; Function .....: StdoutToVar_CreateProcess
; Description ..: Runs a command line program and returns its output.
; Parameters ...: sCmd - Commandline to execute.
; ..............: sEncoding - Encoding used by the target process. Look at StrGet() for possible values.
; ..............: sDir - Working directory.
; ..............: nExitCode - Process exit code, receive it as a byref parameter.
; Return .......: Command output as a string on success, empty string on error.
; AHK Version ..: AHK_L x32/64 Unicode/ANSI
; Author .......: Sean (http://goo.gl/o3VCO8), modified by nfl and by Cyruz
; License ......: WTFPL - http://www.wtfpl.net/txt/copying/
; Changelog ....: Feb. 20, 2007 - Sean version.
; ..............: Sep. 21, 2011 - nfl version.
; ..............: Nov. 27, 2013 - Cyruz version (code refactored and exit code).
; ..............: Mar. 09, 2014 - Removed input, doesn't seem reliable. Some code improvements.
; ..............: Mar. 16, 2014 - Added encoding parameter as pointed out by lexikos.
; ..............: Jun. 02, 2014 - Corrected exit code error.
; ..............: Nov. 02, 2016 - Fixed blocking behavior due to ReadFile thanks to PeekNamedPipe.
; ----------------------------------------------------------------------------------------------------------------------
StdoutToVar_CreateProcess(sCmd, sEncoding:="CP0", sDir:="", ByRef nExitCode:=0) {
DllCall( "CreatePipe", PtrP,hStdOutRd, PtrP,hStdOutWr, Ptr,0, UInt,0 )
DllCall( "SetHandleInformation", Ptr,hStdOutWr, UInt,1, UInt,1 )
VarSetCapacity( pi, (A_PtrSize == 4) ? 16 : 24, 0 )
siSz := VarSetCapacity( si, (A_PtrSize == 4) ? 68 : 104, 0 )
NumPut( siSz, si, 0, "UInt" )
NumPut( 0x100, si, (A_PtrSize == 4) ? 44 : 60, "UInt" )
NumPut( hStdOutWr, si, (A_PtrSize == 4) ? 60 : 88, "Ptr" )
NumPut( hStdOutWr, si, (A_PtrSize == 4) ? 64 : 96, "Ptr" )
If ( !DllCall( "CreateProcess", Ptr,0, Ptr,&sCmd, Ptr,0, Ptr,0, Int,True, UInt,0x08000000
, Ptr,0, Ptr,sDir?&sDir:0, Ptr,&si, Ptr,&pi ) )
Return ""
, DllCall( "CloseHandle", Ptr,hStdOutWr )
, DllCall( "CloseHandle", Ptr,hStdOutRd )
DllCall( "CloseHandle", Ptr,hStdOutWr ) ; The write pipe must be closed before reading the stdout.
While ( 1 )
{ ; Before reading, we check if the pipe has been written to, so we avoid freezings.
If ( !DllCall( "PeekNamedPipe", Ptr,hStdOutRd, Ptr,0, UInt,0, Ptr,0, UIntP,nTot, Ptr,0 ) )
Break
If ( !nTot )
{ ; If the pipe buffer is empty, sleep and continue checking.
Sleep, 100
Continue
} ; Pipe buffer is not empty, so we can read it.
VarSetCapacity(sTemp, nTot+1)
DllCall( "ReadFile", Ptr,hStdOutRd, Ptr,&sTemp, UInt,nTot, PtrP,nSize, Ptr,0 )
sOutput .= StrGet(&sTemp, nSize, sEncoding)
}
; * SKAN has managed the exit code through SetLastError.
DllCall( "GetExitCodeProcess", Ptr,NumGet(pi,0), UIntP,nExitCode )
DllCall( "CloseHandle", Ptr,NumGet(pi,0) )
DllCall( "CloseHandle", Ptr,NumGet(pi,A_PtrSize) )
DllCall( "CloseHandle", Ptr,hStdOutRd )
Return sOutput
}
Return