you have several options:
- use the wperl.exe provided with ActivePerl to run your script. this is a copy of perl.exe that just doesn't create a console window at all. remember, however, that you have no STDIN/STDOUT/STDERR, so you can't even catch errors. be sure your script is totally bulletproof before calling it with wperl.exe. also note that more info about this method are available here.
- use Win32::GUI and the following lines:
use Win32::GUI;
my $hw = Win32::GUI::GetPerlWindow();
Win32::GUI::Hide($hw);
- use Win32::API, but this requires a lot of work:
use Win32::API 0.20;
# just for completeness...
use constant SW_HIDE => 0;
use constant SW_SHOWNORMAL => 1;
# the API we need
my $GetConsoleTitle = new Win32::API('kernel32', 'GetConsoleTitle', 'P
+N', 'N');
my $SetConsoleTitle = new Win32::API('kernel32', 'SetConsoleTitle', 'P
+', 'N');
my $FindWindow = new Win32::API('user32', 'FindWindow', 'PP', 'N');
my $ShowWindow = new Win32::API('user32', 'ShowWindow', 'NN', 'N');
# save the current console title
my $old_title = " " x 1024;
$GetConsoleTitle->Call( $old_title, 1024 );
# build up a new (fake) title
my $title = "PERL-$$-".Win32::GetTickCount();
# sets our string as the console title
$SetConsoleTitle->Call( $title );
# sleep 40 milliseconds to let Windows rename the window
Win32::Sleep(40);
# find the window by title
$hw = $FindWindow->Call( 0, $title );
# restore the old title
$SetConsoleTitle->Call( $old_title );
# hide the console!
$ShowWindow->Call( $hw, SW_HIDE );
# sleep one second, then show the console again
sleep(1);
$ShowWindow->Call( $hw, SW_SHOWNORMAL );
what the above code does is exactly what Win32::GUI does (a nasty trick I've found in the MSDN documentation :-).
cheers,
Aldo
King of Laziness, Wizard of Impatience, Lord of Hubris | [reply] [d/l] [select] |
You could also simply use a "starter" script to launch your process as a detached process:
Win32::Process::Create($Obj, $perl_path . "/perl.exe","perl test.pl",0
+,DETACHED_PROCESS,$hs_path . "/scripts") || die ErrorReport();
-Nitrox | [reply] [d/l] |
This works on my system as long as I'm not trying to hide a window I'm typing in. Which is pretty useful - I can see STDERR / debugging info if I run the command from a shell, but the window is hidden if launched from explorer / start > run / etc
sub hide_console {
# Hide the dos window
require Win32::API;
my $FreeConsole = new Win32::API('kernel32', 'FreeConsole', [], 'I
+');
$FreeConsole->Call();
}
-- simonflk
update: according to MSDN, this should work on Windows 95 and above. | [reply] [d/l] |
| [reply] |