zcbenz 发表于 2008-5-10 23:09:21

浅谈用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
;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 Then
Return $lResult
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——

D4llower 发表于 2008-5-17 00:30:45

这么好的帖子竟然没人顶...

sanhen 发表于 2008-5-17 00:39:58

zcbenz兄的大作。现在重发的了。所以顶的人少。嘿嘿。。。

不过他的大作一向都是非常经典的。只是比较低调。。。牛人一般都是这样的。

大作悄悄的发上论坛,
正如他静静的上论坛,
挥一挥手,
留下满论坛的经典!

                  对此。ACN致以崇高的敬意!!!

破帽遮颜 发表于 2008-5-17 01:12:41

帮顶!最喜欢牛人发帖子了!呵呵~

meteorln 发表于 2008-5-29 12:07:12

好贴..太厉害了

kakinkgb 发表于 2008-5-29 22:30:30

锁定任务栏是哪个消息?

bdrdc 发表于 2008-7-5 22:32:00

这个不错,可惜如果任务栏被手动拉到屏幕底下,则无效。

lantu 发表于 2009-1-14 22:06:21

的确是很不错的!认真学习

135956 发表于 2009-4-27 02:40:55

好...慢慢看..

xphome 发表于 2009-5-5 13:06:18

好帖子,不错。

都市浪子666 发表于 2009-5-7 16:40:15

好贴。收下了,谢谢分享

seeking 发表于 2009-5-18 10:22:11

收藏了
以后再好好学习一下

seeking 发表于 2009-5-18 10:22:15

收藏了
以后再好好学习一下

qvvcity 发表于 2010-2-9 16:48:19

看一下,谢谢

冷风无泪 发表于 2010-2-16 19:55:29

很强大啊,学习了!~~
页: [1] 2
查看完整版本: 浅谈用SHAppBarMessage函数控制任务栏