浅谈用SHAppBarMessage函数控制任务栏

利用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.au3 的UDF

;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
申明:本站资源大部分来自网络,如果无意侵犯了你的权利,请及时通知我们 AutoIt@FoxMail.Com,我们将尽快处理
Copyright © 2008-2009 随便复制 共享精神 人人有责 All Right Reserved
粤ICP备08009024号