|
From: Robert M. <ro...@th...> - 2008-12-08 11:21:50
|
Ignore me. I mis-read the question, which was about the 'lock the
taskbar' functionality, not about auto-hiding the taskbar.
I have no better approach than that already found by Rob for this. I
still maintain that the WM_COMMAND values for this will not be
guaranteed between OS releases (but you might get lucky).
Rob.
2008/12/8 Robert May <ro...@th...>:
> 2008/12/8 Perl Rob <pe...@co...>:
>> 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.
>
|