2008/12/8 Perl Rob <[EMAIL PROTECTED]>:
> It turns out that editing the registry is not necessary. I simply had to
> send the WM_COMMAND message (which means a command was selected from a menu)
> and a specific message number (which, for locking/unlocking the taskbar,
> happens to be 424). Here's the code in its entirety—just 3 lines. I decided
> to use SendMessageTimeout() in case the taskbar doesn't respond:
>
> use Win32::GUI qw(WM_COMMAND);
>
> my $taskbar = Win32::GUI::FindWindow("Shell_TrayWnd", "");
>
> Win32::GUI::SendMessageTimeout($taskbar, WM_COMMAND, 424, 0, 0, 1000);
>
> By the way, I found a list of message numbers in the 3rd post here (although
> I'm still not sure where these message numbers are actually defined):
>
> http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/eb0b17d6-66de-4ce6-bb3a-0c174a17991e

They are not officially defined, and you'll get no guarantee that they
remain the same between different releases of the windows OS.

The 'official' way to do this is to call the SHAppBarMessage() function:
http://msdn.microsoft.com/en-us/library/bb762108.aspx

using it to send the ABM_SETSTATE message:
http://msdn.microsoft.com/en-us/library/bb787961(VS.85).aspx

(If you just want to toggle the auto-hide bit (leaving the
always-on-top state unchanged), then you need to call the function
with the ABM_GETSTATE message type first, and then flit the auto-hide
bit).

Something like this:

#!perl -w
use strict;
use warnings;

# Toggle auto-hide state of windows taskbar

use Win32::API qw();

# Import the ShAppBarMessage() API call
Win32::API->Import("shell32","SHAppBarMessage","LP","L") or die $^E;

# Constants that we will use
sub ABM_SETSTATE()    {0x0000000A} # Set State message
sub ABM_GETSTATE()    {0x00000004} # Get State message
sub ABS_AUTOHIDE()    {0x00000001} # Auto-hide flag


my $state = get_taskbar_state();
$state ^= ABS_AUTOHIDE;  # toggle state bit
set_taskbar_state($state);
exit(0);

sub get_taskbar_state {
        return SHAppBarMessage(ABM_GETSTATE,
                pack("LLIIiiiiL", 32, 0, 0, 0, 0, 0, 0, 0, 0 ));
}

sub set_taskbar_state {
        my $state = shift;
        SHAppBarMessage(ABM_SETSTATE,
                pack("LLIIiiiiL", 36, 0, 0, 0, 0, 0, 0, 0, $state ));
        return;
}
__END__

Regards,
Rob.

------------------------------------------------------------------------------
SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada.
The future of the web can't happen without you.  Join us at MIX09 to help
pave the way to the Next Web now. Learn more and register at
http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/
_______________________________________________
Perl-Win32-GUI-Users mailing list
Perl-Win32-GUI-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
http://perl-win32-gui.sourceforge.net/

Reply via email to