If I use SetChildShowWindow(SW_HIDE) wperl.exe won't open the console window for the piped process but the app itself crashes anyway (in fact NO code following the Open2 seems to be processed - it simply freezes at that point). Your second solution won't work since $cflags (creation flags, like CREATE_NO_WINDOW) can only be passed to a Win32::Process object if the process is created by Win32::Process::Create. If you create a process from a pid through Win32::Process::Open $cflags can not be passed (therefore you can't shut down a window created by Open2 or the window of the script itself).
.