返回列表 发帖

用Autoit进行简单的桌面操作

虽然autoit本身并不提供操作桌面的相关函数,不过利用已有的窗口函数我们仍可以对桌面进行简单的控制。

一、桌面句柄的取得

Windows的桌面实际上就是一个窗口,其标题就是“Program Manager”,而桌面上的图标则是一个标准的SysListView32控件。因此,我们可以这样获取桌面窗口和控件的句柄:
  1. $handle = WinGetHandle("Program Manager") ;窗口句柄
  2. $ctrl = ControlGetHandle("Program Manager","","SysListView321")  ;控件句柄
复制代码
当然了,使用窗口函数时我们并不一定要用窗口句柄和控件句柄,不过在调用系统API时我们只能使用窗口句柄,而且这样会让代码更整洁一些。

二、对桌面窗口的控制

既然已经得到了桌面窗口的句柄,我们就不妨利用窗口函数对桌面简单操作一下:
  1. WinClose  ($handle) ;显示关机对话框
  2. Sleep(5000)
  3. WinSetTrans ($handle,"",100) ;桌面图标透明(实际上没这么简单)
  4. $pos = WinGetPos  ($handle)
  5. MsgBox(0,"DesktopWidth",$pos[2])
  6. MsgBox(0,"DesktopHeight",$pos[3])
  7. WinKill ($handle) ;重启桌面
复制代码
另外需要说明的是,只要用WinMove函数移动桌面,桌面图标就会消失。

三、对桌面图标的控制

因为桌面图标是一个ListView32控件,所以用ControlListView函数就可以对桌面图标进行基本的操作:
  1. ControlListView($handle,"",$ctrl,"SelectAll") ;选中桌面全部图标
  2. ControlListView($handle,"",$ctrl,"SelectClear") ;取消选择
  3. ControlListView($handle,"",$ctrl,"Select",4,7) ;选中第5到8个图标
  4. MsgBox(0,"第一个图标名称",ControlListView($handle,"",$ctrl,"GetText",0,0))
  5. MsgBox(0,"图标总数",ControlListView($handle,"",$ctrl,"GetItemCount"))
  6. MsgBox(0,"选中图标数",ControlListView($handle,"",$ctrl,"GetSelectedCount"))
  7. ControlListView($handle,"",$ctrl,"ViewChange","list") ;列表形式显示桌面图标(失败)
  8. ControlListView($handle,"",$ctrl,"ViewChange","details") ;以"详细信息"的形式列出
  9. ControlListView($handle,"",$ctrl,"ViewChange","smallicons") ;复原
  10. ControlListView($handle,"",$ctrl,"ViewChange","largeicons") ;同上
  11. ControlDisable ($handle,"",$ctrl) ;无法点击桌面图标
  12. ControlEnable  ($handle,"",$ctrl) ;恢复
  13. ControlHide  ($handle,"",$ctrl) ;隐藏桌面图标
  14. ControlShow  ($handle,"",$ctrl) ;恢复
  15. ;下面是列出全部选中的图标
  16. $num = ControlListView($handle,"",$ctrl,"GetSelected",1)
  17. $array= StringSplit($num,"|")
  18. For $i = 1 To $array[0]
  19. MsgBox(0,"选中的第"&$i&"个图标",ControlListView($handle,"",$ctrl,"GetText",$array[$i],0))
  20. Next
复制代码
四、结束语

实际上通过调用API我们仍能进行更为复杂的操作,例如设置文字颜色、移动图标,但本文不再进行讨论。

——END——

用Autoit进行简单的桌面操作(补完)

在上一文里我提过,利用API我们可以完成诸如移动桌面图标之类的操作。本文将着重讨论这方面的技术。

1.移动桌面图标

移动图标主要靠发送LVM_SETITEMPOSITION消息来实现,下面是一个例子,其中$i_index、$i_x、$i_y分别代表要移动的图标(这里是第2个)、移动到的x坐标、y坐标:
  1. #include <Misc.au3>

  2. Global Const $LVM_FIRST = 0x1000
  3. Global Const $LVM_SETITEMPOSITION = ($LVM_FIRST + 15)

  4. $i_index = 1
  5. $i_x = 500
  6. $i_y = 600

  7. _SendMessage(ControlGetHandle("Program Manager","",1), $LVM_SETITEMPOSITION, $i_index, BitOR(BitShift($i_y, -16), BitAND($i_x, 0xFFFF)))
复制代码
2.设置桌面的对齐网格

由于对齐网格是listview控件的一种style,所以通过使用LVM_SETEXTENDEDLISTVIEWSTYLE消息我们就能对此进行设置:
  1. #Include <misc.au3>
  2. #include <GuiListView.au3>

  3. $LVS_EX_SNAPTOGRID = 0x80000

  4. ;对齐到网格
  5. _SendMessage(ControlGetHandle("Program Manager","",1), $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_SNAPTOGRID, $LVS_EX_SNAPTOGRID)

  6. ;不对齐
  7. _SendMessage(ControlGetHandle("Program Manager","",1), $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_SNAPTOGRID, 0)
复制代码
3.让窗口处于最下层

通过将某一窗口设为桌面的子窗口,我们就能实现窗口置底:
  1. $gui = GuiCreate("MyGUI", 227, 119)
  2. DllCall("user32.dll", "int", "SetParent", "hwnd", $gui, "hwnd",WinGetHandle("Program Manager"))

  3. GuiSetState()

  4. Do
  5. ;;;
  6. Until GuiGetMsg() =-3

  7. Exit
复制代码
4.设置任务栏的状态

利用SHAppBarMessage函数我们能对任务栏的状态进行控制:
  1. Global Const $ABM_SETSTATE = 0x0000000a
  2. Global Const $ABS_ALWAYSONTOP = 0x2
  3. Global Const $ABS_AUTOHIDE = 0x1

  4. Global $pabd = DllStructCreate("dword;int;uint;uint;int;int;int;int;int")
  5. DllStructSetData($pabd,1,DllStructGetSize($pabd)) ;cbSize
  6. DllStructSetData($pabd,2,ControlGetHandle("Start","","Shell_TrayWnd")) ;hWnd

  7. Func SHAppBarMessage($Message,ByRef $pabd)
  8. $lResult = DllCall("shell32.dll","int","SHAppBarMessage","int",$Message,"ptr",DllStructGetPtr($pabd))
  9. If Not @error Then
  10. If $lResult[0] Then
  11. Return $lResult[0]
  12. EndIf
  13. EndIf
  14. SetError(1)
  15. Return False
  16. EndFunc

  17. ;要设置不同的状态,请取消相应语句的注释
  18. ;DllStructSetData($pabd,9,$ABS_AUTOHIDE) ;自动隐藏,且不位于窗口前
  19. ;DllStructSetData($pabd,9,$ABS_ALWAYSONTOP) ;不自动隐藏,且位于窗口前
  20. DllStructSetData($pabd,9,BitOR($ABS_ALWAYSONTOP,$ABS_AUTOHIDE)) ;自动隐藏,且位于窗口前

  21. SHAppBarMessage($ABM_SETSTATE,$pabd) ;发送ABM_SETSTATE消息应用修改
复制代码
更多关于SHAppBarMessage函数的信息请看这里

5.隐藏任务栏、开始按钮、任务栏图标等

说到这里我们已经转向了对任务栏的控制,同桌面一样,任务栏也是一个窗口,开始按钮、时钟等都是其下的控件,我们可以像控制窗口一样控制任务栏:
  1. Opt("WinTitleMatchMode", 4)

  2. $sTrayWindow = WinGetHandle("[CLASS:Shell_TrayWnd]") ;窗口句柄

  3. $sTrayClock = ControlGetHandle($sTrayWindow,"","TrayClockWClass1") ;时钟句柄
  4. $sTrayNotify = ControlGetHandle($sTrayWindow,"","TrayNotifyWnd1") ;任务栏图标句柄
  5. $sStartButton = ControlGetHandle($sTrayWindow,"","Button1") ;开始按钮句柄


  6. ;隐藏任务栏
  7. WinSetState($sTrayWindow,"",@SW_HIDE)

  8. ;隐藏任务栏时钟
  9. WinSetState($sTrayClock,"",@SW_SHOW)

  10. ;隐藏任务栏图标(会马上还原)
  11. WinSetState($sTrayNotify,"",@SW_HIDE)

  12. ;隐藏开始按钮
  13. WinSetState($sStartButton,"",@SW_HIDE)
复制代码
6.桌面图标的相关控制

细心的朋友会发现,我控制桌面图标时都是用的名为SendMessage的API函数,而autoit里全部以_GUICtrlListView打头的函数都是这样定义的,也就是说,利用autoit已有的这些函数我们就能对桌面图标进行控制,比如说:
  1. #include <GuiListView.au3>
  2. _GUICtrlListViewDeleteAllItems (ControlGetHandle("Program Manager","","SysListView321"))
复制代码
另外,Auto3Lib里也有大量与listview有关的函数,你可以在这里下载。

[ 本帖最后由 zcbenz 于 2008-5-10 23:08 编辑 ]
2

评分人数

  • sunwei4616

  • 漠北雪~狼

太厉害了,又学了一招,谢谢

TOP

先来试验试验

TOP

收下了,谢谢!

TOP

不错的, 学到好多知识`

TOP

又学了一个 。。 谢谢

TOP

相当不错,前几天弄了个置顶透明工具,结果桌面搞得怪怪的:

透明后,桌面上的图标什么的都透明了,还成
不透明了,桌面上的图标都恢复了,不错
可现在桌面的壁纸没了,变成黑底了

把这贴看明白,应该问题就解决了!先支持了!

TOP

虽然看的不是很懂 还在学习中

TOP

不错的, 学到好多知识`

TOP

正在进一步学习当中……

TOP

好东西

TOP

好东东,学习了

TOP

收藏,以后会经常用到

TOP

好东西,,这对我有太多的好处了,

TOP

好东西,,这对我有太多的好处了,

TOP

返回列表