From: Robert M. <rm...@po...> - 2006-06-03 12:04:34
|
Glenn Linderman wrote: > On approximately 5/30/2006 12:10 PM, came the following characters from > the keyboard of Robert May: >> Jeremy White wrote: >>>> Something like this: >>>> - ability to close Console if there is one present and its not needed >>>> - automatically re-create a console window if any reads/writes are >>>> done on stdin/out/err >>>> - ability to set the Console window title, Icon etc. >>>> >>>> Eventually remove GetPerlWindow() from GUI.xs?? >>> >>> I suspect I'm missing the point:) But why do any of this? During >>> development most people would run with the console window showing - >>> makes debugging a GUI app so much simpler. Then when the script needs >>> to be deployed (either by wperl, or one of the exe creators) - the >>> console is automatically not created? > > Yes, that can/has been done. > > My personal twist on this is that I hide the console window, but have a > button to show it again, if the user wants to see the debugging message, > or if I am working with the user, and want them to read them to me. That's nice. I'd like to hide the console, and have it automatically re-appear when something bad happens (e.g. a warn/carp/croak ... in fact probably when anything is written to STDERR). I've got a prototype running using tie()d file handles; I also want to investigate using a perlIO layer for this, as it feels that would be cleaner, but that can only be used on perl 5.7 and above. > For my applications (packaged with PAR), it isn't likely that the user > will start them from a console window (CMD), but I do it, and get plenty > annoyed when the app crashes and my CMD goes away. I think an option to add an END block that prints a message and waits for a keystroke would be useful here - it won't keep the console around if perl really crashes, but it should keep it around to allow reading of most script-level warnings/errors. > I have no idea how to detect if the console for the APP is the same as > the one used to launch the APP, or even if it is possible to determine > that, but if it is possible to determine that, I'd like the option > (which I would use in several APPs) of then detaching from the original > console and creating a new one for the APP. Preferably, the new one > could be initially hidden. I think it should be possible to tell which case we're in: if perl.exe is run from an existing command window, then the perl.exe process is a 'child' of its command window process; if perl.exe is launched by double-clicking the .pl file, then the command window process is a 'child' of perl.exe. It's just that there doesn't seem to be a simple, cross-platform way of determining child-parent process relationships in windows. With some XS code I think I can determine this relationship on all the platforms that we need to support other than NT. (so it'll be OK on W95/98/ME/2K/XP. If you don't mind it looking a bit clunky, then you can already achieve a process always having it's own console: use Win32::GUI(); use Win32::Console(); # Detach from any existing console, fails silently # if there is no existing console Win32::Console::Free(); # Create and then hide a new console Win32::Console::Alloc(); my $chwnd = Win32::GetPerlWindow(); Win32::GUI::Hide($chwnd); You get a flash of console once when launching from the command line (the Free() does nothing, the Alloc() creates a new visible console which then gets hidden almost immediately.) You get 2 console flashes for an app that is double-clicked to start (the app creates it's own visible console, which then disappears when Free() is called, the Alloc() creates a new, visible console that then gets hidden.) If only there was a way to ask AllocWindow() to create a hidden console, but I read that it's impossible. (I do want to explore the possibility of using a global hook to see if I can catch one of the messages that happens early during window creation, and fiddle the WS_VISIBLE style, but I'm not hopeful!) Rob. |