浅谈用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—— 这么好的帖子竟然没人顶... zcbenz兄的大作。现在重发的了。所以顶的人少。嘿嘿。。。
不过他的大作一向都是非常经典的。只是比较低调。。。牛人一般都是这样的。
大作悄悄的发上论坛,
正如他静静的上论坛,
挥一挥手,
留下满论坛的经典!
对此。ACN致以崇高的敬意!!! 帮顶!最喜欢牛人发帖子了!呵呵~ 好贴..太厉害了 锁定任务栏是哪个消息? 这个不错,可惜如果任务栏被手动拉到屏幕底下,则无效。 的确是很不错的!认真学习 好...慢慢看.. 好帖子,不错。 好贴。收下了,谢谢分享 收藏了
以后再好好学习一下 收藏了
以后再好好学习一下 看一下,谢谢 很强大啊,学习了!~~
页:
[1]
2