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. > |