利用SHAppBarMessage函数我们可以完成对任务栏的控制,或是获取任务栏的相关信息。
当然了,Autoit本身并不提供该项函数,不过我们可以通过调用API实现,具体方法见下面的例子。
SHAppBarMessage函数的用法:
SHAppBarMessage(消息名,APPBARDATA结构指针)
消息名对应着操作类型,比如ABM_GETSTATE代表着获取任务栏状态,ABM_SETSTATE代表设置任务栏状态等。而APPBARDATA结构指针则储存着任务栏的相关数据,其结构为:
struct APP_BAR_DATA
{
int cbSize;
IntPtr hWnd;
int uCallbackMessage;
int uEdge;
RECT rc;
IntPtr lParam;
}
而RECT本身也包含着一个结构:
struct RECT
{
int left;
int top;
int right;
int bottom;
}
在autoit里写就是:
$pabd = DllStructCreate("dword;int;uint;uint;int;int;int;int;int")
分别对应着cbSize、任务栏句柄、callback指针、边缘的位置、左、上、右、下、状态。
其中cbSize用DllStructGetSize处理就好了,任务栏句柄需要自己添加,别的就不用管了。
顺带一提,用ABM_NEW消息你可以把一个窗口变为任务栏,autoit里已经具备了实现条件,我会抽时间试一下。
理论完毕,剩下的东西就看看下面的例子吧:
- ;SHAppBarMessage
- ;Sends an appbar message to the system.
- ;
- ;Syntax
- ;UINT_PTR SHAppBarMessage( DWORD dwMessage, PAPPBARDATA pData );
- ;
- ;MSDN
- ;http://msdn2.microsoft.com/en-us/library/ms647647.aspx
- ;
- ;Author zHcH
- ;For more information,please visit
- ;http://hi.baidu.com/zhch_ao
- ;------------------------定义一些将要使用的变量----------------------------
- Global Const $ABM_ACTIVATE = 0x06
- Global Const $ABM_GETAUTOHIDEBAR = 0x07
- Global Const $ABM_GETSTATE = 0x04
- Global Const $ABM_SETSTATE = 0x0000000a
- Global Const $ABM_GETTASKBARPOS = 0x05
- Global Const $ABM_NEW = 0x00
- Global Const $ABM_QUERYPOS = 0x02
- Global Const $ABM_REMOVE = 0x01
- Global Const $ABM_SETAUTOHIDEBAR = 0x08
- Global Const $ABM_SETPOS = 0x03
- Global Const $ABM_WINDOWPOSCHANGED = 0x09
- ;---
- Global Const $ABS_ALWAYSONTOP = 0x2
- Global Const $ABS_AUTOHIDE = 0x1
- ;---
- Global Const $ABE_LEFT = 0
- Global Const $ABE_TOP = 1
- Global Const $ABE_RIGHT = 2
- Global Const $ABE_BOTTOM = 3
- ;---
- ;--------------------------建立APPBARDATA结构的指针----------------------------
- ;详细信息:http://msdn2.microsoft.com/en-us/library/ms538008.aspx
- Global $pabd = DllStructCreate("dword;int;uint;uint;int;int;int;int;int")
- DllStructSetData($pabd,1,DllStructGetSize($pabd)) ;cbSize
- DllStructSetData($pabd,2,ControlGetHandle("Start","","Shell_TrayWnd")) ;hWnd
- ;-------------------------定义SHAppBarMessage函数------------------------------
- Func SHAppBarMessage($Message,ByRef $pabd)
- $lResult = DllCall("shell32.dll","int","SHAppBarMessage","int",$Message,"ptr",DllStructGetPtr($pabd))
- If Not @error Then
- If $lResult[0] Then
- Return $lResult[0]
- EndIf
- EndIf
- SetError(1)
- Return False
- EndFunc
- ;----------------------------------例子开始----------------------------------
- ;---------------------ep1.控制任务栏的状态
- #cs
- DllStructSetData($pabd,9,BitOR($ABS_ALWAYSONTOP,$ABS_AUTOHIDE)) ;自动隐藏,且位于窗口前
- DllStructSetData($pabd,9,$ABS_AUTOHIDE) ;自动隐藏,且不位于窗口前
- DllStructSetData($pabd,9,$ABS_ALWAYSONTOP) ;不自动隐藏,且位于窗口前
- SHAppBarMessage($ABM_SETSTATE,$pabd) ;发送ABM_SETSTATE消息应用修改
- #ce
- ;---------------------ep2.获取任务栏状态
- #cs
- $result = SHAppBarMessage($ABM_GETSTATE,$pabd)
- If BitAND($result,$ABS_ALWAYSONTOP) = $ABS_ALWAYSONTOP Then ConsoleWrite("ALWAYSONTOP" & @LF)
- If BitAND($result,$ABS_AUTOHIDE) = $ABS_AUTOHIDE Then ConsoleWrite("AUTOHIDE" & @LF)
- #ce
- ;---------------------ep3.任务栏的位置
- #cs
- $result = SHAppBarMessage($ABM_GETTASKBARPOS,$pabd)
- If $result Then
- ConsoleWrite("Left : " & DllStructGetData($pabd,5) & @LF)
- ConsoleWrite("Top : " & DllStructGetData($pabd,6) & @LF)
- ConsoleWrite("Right : " & DllStructGetData($pabd,7) & @LF)
- ConsoleWrite("Bottom: " & DllStructGetData($pabd,8) & @LF)
- EndIf
- Switch DllStructGetData($pabd,4)
- Case 0
- ConsoleWrite("ABE_LEFT" & @LF)
- Case 1
- ConsoleWrite("ABE_TOP" & @LF)
- Case 2
- ConsoleWrite("ABE_RIGHT" & @LF)
- Case 3
- ConsoleWrite("ABE_BOTTOM" & @LF)
- EndSwitch
- #ce
- ;----------------------------------例子结束--------------------------------------
提示:你可以将此段代码保存为SHAppBarMessage.au3,并放入include文件夹中。此后再要调用该函数只需在脚本头加上 #include <SHAppBarMessage.au3> 。
——END——