返回列表 发帖

浅谈用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里已经具备了实现条件,我会抽时间试一下。

理论完毕,剩下的东西就看看下面的例子吧:
  1. ;SHAppBarMessage
  2. ;Sends an appbar message to the system.
  3. ;
  4. ;Syntax
  5. ;UINT_PTR SHAppBarMessage( DWORD dwMessage, PAPPBARDATA pData );
  6. ;
  7. ;MSDN
  8. ;http://msdn2.microsoft.com/en-us/library/ms647647.aspx
  9. ;
  10. ;Author zHcH
  11. ;For more information,please visit
  12. ;http://hi.baidu.com/zhch_ao

  13. ;------------------------定义一些将要使用的变量----------------------------

  14. Global Const $ABM_ACTIVATE = 0x06
  15. Global Const $ABM_GETAUTOHIDEBAR = 0x07
  16. Global Const $ABM_GETSTATE = 0x04
  17. Global Const $ABM_SETSTATE = 0x0000000a
  18. Global Const $ABM_GETTASKBARPOS = 0x05
  19. Global Const $ABM_NEW = 0x00
  20. Global Const $ABM_QUERYPOS = 0x02
  21. Global Const $ABM_REMOVE = 0x01
  22. Global Const $ABM_SETAUTOHIDEBAR = 0x08
  23. Global Const $ABM_SETPOS = 0x03
  24. Global Const $ABM_WINDOWPOSCHANGED = 0x09
  25. ;---
  26. Global Const $ABS_ALWAYSONTOP = 0x2
  27. Global Const $ABS_AUTOHIDE = 0x1
  28. ;---
  29. Global Const $ABE_LEFT = 0
  30. Global Const $ABE_TOP = 1
  31. Global Const $ABE_RIGHT = 2
  32. Global Const $ABE_BOTTOM = 3
  33. ;---

  34. ;--------------------------建立APPBARDATA结构的指针----------------------------
  35. ;详细信息:http://msdn2.microsoft.com/en-us/library/ms538008.aspx

  36. Global $pabd = DllStructCreate("dword;int;uint;uint;int;int;int;int;int")
  37. DllStructSetData($pabd,1,DllStructGetSize($pabd)) ;cbSize
  38. DllStructSetData($pabd,2,ControlGetHandle("Start","","Shell_TrayWnd")) ;hWnd

  39. ;-------------------------定义SHAppBarMessage函数------------------------------

  40. Func SHAppBarMessage($Message,ByRef $pabd)
  41. $lResult = DllCall("shell32.dll","int","SHAppBarMessage","int",$Message,"ptr",DllStructGetPtr($pabd))
  42. If Not @error Then
  43. If $lResult[0] Then
  44. Return $lResult[0]
  45. EndIf
  46. EndIf
  47. SetError(1)
  48. Return False
  49. EndFunc

  50. ;----------------------------------例子开始----------------------------------

  51. ;---------------------ep1.控制任务栏的状态
  52. #cs
  53. DllStructSetData($pabd,9,BitOR($ABS_ALWAYSONTOP,$ABS_AUTOHIDE)) ;自动隐藏,且位于窗口前
  54. DllStructSetData($pabd,9,$ABS_AUTOHIDE) ;自动隐藏,且不位于窗口前
  55. DllStructSetData($pabd,9,$ABS_ALWAYSONTOP) ;不自动隐藏,且位于窗口前

  56. SHAppBarMessage($ABM_SETSTATE,$pabd) ;发送ABM_SETSTATE消息应用修改
  57. #ce

  58. ;---------------------ep2.获取任务栏状态
  59. #cs
  60. $result = SHAppBarMessage($ABM_GETSTATE,$pabd)
  61. If BitAND($result,$ABS_ALWAYSONTOP) = $ABS_ALWAYSONTOP Then ConsoleWrite("ALWAYSONTOP" & @LF)
  62. If BitAND($result,$ABS_AUTOHIDE) = $ABS_AUTOHIDE Then ConsoleWrite("AUTOHIDE" & @LF)
  63. #ce

  64. ;---------------------ep3.任务栏的位置
  65. #cs
  66. $result = SHAppBarMessage($ABM_GETTASKBARPOS,$pabd)
  67. If $result Then
  68. ConsoleWrite("Left : " & DllStructGetData($pabd,5) & @LF)
  69. ConsoleWrite("Top : " & DllStructGetData($pabd,6) & @LF)
  70. ConsoleWrite("Right : " & DllStructGetData($pabd,7) & @LF)
  71. ConsoleWrite("Bottom: " & DllStructGetData($pabd,8) & @LF)
  72. EndIf

  73. Switch DllStructGetData($pabd,4)
  74. Case 0
  75. ConsoleWrite("ABE_LEFT" & @LF)
  76. Case 1
  77. ConsoleWrite("ABE_TOP" & @LF)
  78. Case 2
  79. ConsoleWrite("ABE_RIGHT" & @LF)
  80. Case 3
  81. ConsoleWrite("ABE_BOTTOM" & @LF)
  82. EndSwitch
  83. #ce

  84. ;----------------------------------例子结束--------------------------------------
复制代码
提示:你可以将此段代码保存为SHAppBarMessage.au3,并放入include文件夹中。此后再要调用该函数只需在脚本头加上 #include <SHAppBarMessage.au3> 。

——END——
1

评分人数

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

TOP

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

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

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

                  对此。ACN致以崇高的敬意!!!
叁十功名何所求,
恨萍聚散谁人偶;
居仙笑谓人生戏,
士人但求仙鹤楼。

TOP

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

TOP

好贴..太厉害了

TOP

锁定任务栏是哪个消息?

TOP

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

TOP

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

TOP

好...慢慢看..

TOP

好帖子,不错。

TOP

好贴。收下了,谢谢分享

TOP

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

TOP

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

TOP

看一下,谢谢

TOP

很强大啊,学习了!~~

TOP

返回列表