http://www.perlmonks.org?node_id=11123014


in reply to Re^3: Win32::SysTray Issue ( Win32::GUI::DoEvents )
in thread Win32::SysTray Issue

Half the code works. It creates the Icon just fine...does NOT create the sub menu. It does NOT create the prompt message until I quit the program using Ctrl+C. A good guess would be that the Icon feature needs to break away from the main program and not block the rest of the code from working and when selected from the Icon quit the program some how? Thanks for the help so far.

  • Comment on Re^4: Win32::SysTray Issue ( Win32::GUI::DoEvents )

Replies are listed 'Best First'.
Re^5: Win32::SysTray Issue ( Win32::GUI::DoEvents )
by jcb (Parson) on Oct 21, 2020 at 01:16 UTC

    I forgot to mention setting $| = 1; before the first print to turn off line-buffering on STDOUT. Oops.

    Preventing the icon feature from blocking the main program is exactly why there is a Win32::GUI::DoEvents call in the loop in the Prompt sub.

      The changes I made based on your suggestions did not work...I do have the changes in the correct places right? Thanks for the help.

      ::ANSIScreen; use Win32::Console; use Win32::SysTray; no warnings 'numeric'; $| = 1; # ADDED tray(); begin(); sub begin { # START BEGIN print "-------------------------------------------\n"; print "Please Choose One of the Following Options:\n"; print "-------------------------------------------\n\n\n"; print "(1) EMPLOYEE MANAGEMENT \n\n"; print "(Q) QUIT \n\n"; print " \n\n\n\n"; my $input = Prompt("? "); # ADDED if ($input){ if ( $input == 1 ){ sleep(3); begin(); } if ( $input eq "q" ) { sleep 3; exit; } } # END INPUT } # END BEGIN sub tray { my $stray = new Win32::SysTray ( 'name' => 'TEST', 'icon' => 'C:\images\logo.ico', 'single' => 1, ) or exit 0; $stray->setMenu ( "> &Test" => sub { print "Hello from the Tray\n"; }, ">-" => 0, "> E&xit" => sub { exit; }, ); } sub Prompt { my $prompt = shift; print "\n$prompt "; my $response = ''; my $rsel = ''; my $rrdy; vec($rsel,fileno(STDIN),1) = 1; CHAR: while (1) { die "user quit" if -1 == Win32::GUI::DoEvents(); while (select($rrdy=$rsel, undef, undef, 0.10)) { sysread(STDIN, $response, 1, length $response) == 1 or die "read error"; } last CHAR if chomp($response); } return $response; }