How can this be done?
I have this code as a prototype:
It creates a temporary file that writes periodically to OutputDebug, stdout and stderr.
While it is running, you can hit F2 to close it midway, but it doesn't close the process, it continues to write to stdout and stderr.
Code: Select all
File = %A_ScriptDir%\test.ahk
Script =
(%
Loop, 10
{
Sleep 2000
OutputDebug, OutputDebug %A_Index%``n
FileAppend, StdOut %A_Index%``n, *
FileAppend, StdErr %A_Index%``n, **
}
)
FileDelete, %File%
FileAppend, %script%, %File%
cmd = %A_ComSpec% /c "%A_AHKPath% /ErrorStdOut "%File%""
StdOutStream( cmd, "Callback" )
ExitApp
Esc:: ExitApp
F2::
StdOutKill()
Return
Callback(Line, Index){
static t
t .= Index " - " Line
ToolTip, Callback:`n%t%, 0 , 0, 1
}
StdOutKill(hProcess:=""){
static PID
If hProcess {
PID := hProcess
Callback(PID "`n", "set")
}
Else If PID {
Process, Close, %PID%
Callback(PID "`n", "close")
; PID =
}
}
StdOutStream( sCmd, Callback = "" ) { ; Modified : SKAN 31-Aug-2013 http://goo.gl/j8XJXY
Static StrGet := "StrGet" ; Thanks to : HotKeyIt http://goo.gl/IsH1zs
; Original : Sean 20-Feb-2007 http://goo.gl/mxCdn
DllCall( "CreatePipe", UIntP,hPipeRead, UIntP,hPipeWrite, UInt,0, UInt,0 )
DllCall( "SetHandleInformation", UInt,hPipeWrite, UInt,1, UInt,1 )
VarSetCapacity( STARTUPINFO, 68, 0 ) ; STARTUPINFO ; http://goo.gl/fZf24
NumPut( 68, STARTUPINFO, 0 ) ; cbSize
NumPut( 0x100, STARTUPINFO, 44 ) ; dwFlags => STARTF_USESTDHANDLES = 0x100
NumPut( hPipeWrite, STARTUPINFO, 60 ) ; hStdOutput
NumPut( hPipeWrite, STARTUPINFO, 64 ) ; hStdError
VarSetCapacity( PROCESS_INFORMATION, 16 ) ; PROCESS_INFORMATION ; http://goo.gl/b9BaI
If ! DllCall( "CreateProcess", UInt,0, UInt,&sCmd, UInt,0, UInt,0 ; http://goo.gl/USC5a
, UInt,1, UInt,0x08000000, UInt,0, UInt,0
, UInt,&STARTUPINFO, UInt,&PROCESS_INFORMATION )
Return ""
, DllCall( "CloseHandle", UInt,hPipeWrite )
, DllCall( "CloseHandle", UInt,hPipeRead )
, DllCall( "SetLastError", Int,-1 )
hProcess := NumGet( PROCESS_INFORMATION, 0 )
hThread := NumGet( PROCESS_INFORMATION, 4 )
StdOutKill(hProcess)
DllCall( "CloseHandle", UInt,hPipeWrite )
AIC := ( SubStr( A_AhkVersion, 1, 3 ) = "1.0" ) ; A_IsClassic
VarSetCapacity( Buffer, 4096, 0 ), nSz := 0
While DllCall( "ReadFile", UInt,hPipeRead, UInt,&Buffer, UInt,4094, UIntP,nSz, Int,0 ) {
tOutput := ( AIC && NumPut( 0, Buffer, nSz, "Char" ) && VarSetCapacity( Buffer,-1 ) )
? Buffer
: %StrGet%( &Buffer, nSz, "CP850" )
Isfunc( Callback ) ? %Callback%( tOutput, A_Index ) : sOutput .= tOutput
}
DllCall( "GetExitCodeProcess", UInt,hProcess, UIntP,ExitCode )
DllCall( "CloseHandle", UInt,hProcess )
DllCall( "CloseHandle", UInt,hThread )
DllCall( "CloseHandle", UInt,hPipeRead )
DllCall( "SetLastError", UInt,ExitCode )
Return Isfunc( Callback ) ? %Callback%( "", 0 ) : sOutput
}