I never figured out how to make hb_processRun() hide the window but I did learn how to get hb_processOpen() to do what I want. I've been using some variation of the below function for quite a while to run a silent shell and capture stdio (and stderr)
FUNCTION ShellExec( cCMD, lBackground, nLoopDelayMS )
LOCAL nChild, nPID
LOCAL hStdIn, hStdOUT
LOCAL cOutResults
LOCAL cStdOUT
LOCAL nOutBytes
LOCAL cResults := ""
hb_default( @lBackground, .T. )
hb_default( @nLoopDelayMS, .200 )
nChild := hb_processOpen( cCMD, @hStdIn, @hStdOut, @hStdOut, lBackground, @nPID )
IF nChild >= 00
cOutResults := ""
cStdOut := Space( DEFAULT_BUFFER_SIZE )
DO WHILE ! Empty( nOutBytes := FRead( hStdOut, @cStdOut, DEFAULT_BUFFER_SIZE ) )
cOutResults += Left( cStdOut, nOutBytes )
cStdOut := Space( DEFAULT_BUFFER_SIZE )
hb_idleSleep( nLoopDelayMS )
ENDDO
hb_processClose( nChild )
#if defined( __PLATFORM__WINDOWS )
hb_ProcessValue( nChild )
#else
hb_ProcessValue( nPID )
#endif
ELSE
cResults := "<error>"
ENDIF
FClose( nChild )
FClose( hStdOUT )
RETURN ( cResults )