利用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. ;------------------------定义一些将要使用的变量----------------------------  
  15.  
  16. Global Const $ABM_ACTIVATE = 0x06  
  17. Global Const $ABM_GETAUTOHIDEBAR = 0x07  
  18. Global Const $ABM_GETSTATE = 0x04  
  19. Global Const $ABM_SETSTATE = 0x0000000a  
  20. Global Const $ABM_GETTASKBARPOS = 0x05  
  21. Global Const $ABM_NEW = 0x00  
  22. Global Const $ABM_QUERYPOS = 0x02  
  23. Global Const $ABM_REMOVE = 0x01  
  24. Global Const $ABM_SETAUTOHIDEBAR = 0x08  
  25. Global Const $ABM_SETPOS = 0x03  
  26. Global Const $ABM_WINDOWPOSCHANGED = 0x09  
  27. ;---  
  28. Global Const $ABS_ALWAYSONTOP = 0x2  
  29. Global Const $ABS_AUTOHIDE = 0x1  
  30. ;---  
  31. Global Const $ABE_LEFT = 0  
  32. Global Const $ABE_TOP = 1  
  33. Global Const $ABE_RIGHT = 2  
  34. Global Const $ABE_BOTTOM = 3  
  35. ;---  
  36.  
  37. ;--------------------------建立APPBARDATA结构的指针----------------------------  
  38. ;详细信息:http://msdn2.microsoft.com/en-us/library/ms538008.aspx  
  39.  
  40. Global $pabd = DllStructCreate("dword;int;uint;uint;int;int;int;int;int")  
  41. DllStructSetData($pabd,1,DllStructGetSize($pabd)) ;cbSize  
  42. DllStructSetData($pabd,2,ControlGetHandle("Start","","Shell_TrayWnd")) ;hWnd  
  43.  
  44. ;-------------------------定义SHAppBarMessage函数------------------------------  
  45.  
  46. Func SHAppBarMessage($Message,ByRef $pabd)  
  47. $lResult = DllCall("shell32.dll","int","SHAppBarMessage","int",$Message,"ptr",DllStructGetPtr($pabd))  
  48. If Not @error Then  
  49. If $lResult[0] Then  
  50. Return $lResult[0]  
  51. EndIf  
  52. EndIf  
  53. SetError(1)  
  54. Return False  
  55. EndFunc  
  56.  
  57. ;----------------------------------例子开始----------------------------------  
  58.  
  59. ;---------------------ep1.控制任务栏的状态  
  60. #cs  
  61. DllStructSetData($pabd,9,BitOR($ABS_ALWAYSONTOP,$ABS_AUTOHIDE)) ;自动隐藏,且位于窗口前  
  62. DllStructSetData($pabd,9,$ABS_AUTOHIDE) ;自动隐藏,且不位于窗口前  
  63. DllStructSetData($pabd,9,$ABS_ALWAYSONTOP) ;不自动隐藏,且位于窗口前  
  64.  
  65. SHAppBarMessage($ABM_SETSTATE,$pabd) ;发送ABM_SETSTATE消息应用修改  
  66. #ce  
  67.  
  68. ;---------------------ep2.获取任务栏状态  
  69. #cs  
  70. $result = SHAppBarMessage($ABM_GETSTATE,$pabd)  
  71. If BitAND($result,$ABS_ALWAYSONTOP) = $ABS_ALWAYSONTOP Then ConsoleWrite("ALWAYSONTOP" & @LF)  
  72. If BitAND($result,$ABS_AUTOHIDE) = $ABS_AUTOHIDE Then ConsoleWrite("AUTOHIDE" & @LF)  
  73. #ce  
  74.  
  75. ;---------------------ep3.任务栏的位置  
  76. #cs  
  77. $result = SHAppBarMessage($ABM_GETTASKBARPOS,$pabd)  
  78. If $result Then  
  79. ConsoleWrite("Left : " & DllStructGetData($pabd,5) & @LF)  
  80. ConsoleWrite("Top : " & DllStructGetData($pabd,6) & @LF)  
  81. ConsoleWrite("Right : " & DllStructGetData($pabd,7) & @LF)  
  82. ConsoleWrite("Bottom: " & DllStructGetData($pabd,8) & @LF)  
  83. EndIf  
  84.  
  85. Switch DllStructGetData($pabd,4)  
  86. Case 0  
  87. ConsoleWrite("ABE_LEFT" & @LF)  
  88. Case 1  
  89. ConsoleWrite("ABE_TOP" & @LF)  
  90. Case 2  
  91. ConsoleWrite("ABE_RIGHT" & @LF)  
  92. Case 3  
  93. ConsoleWrite("ABE_BOTTOM" & @LF)  
  94. EndSwitch  
  95. #ce  
  96.  
  97. ;----------------------------------例子结束-------------------------------------- 

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

——END——