找回密码
 加入
搜索
查看: 14952|回复: 24

[转贴] DllCall的使用

 火... [复制链接]
发表于 2008-5-10 12:25:29 | 显示全部楼层 |阅读模式
DllCall的使用

[翻译转帖]列表当前所有窗体-使用DllCall--大家一起学习一下

这个程序可以遍历当前窗体,并查找其标题,用消息框显示出来。
子程序是Larry大师的作品,可以做为功能子程序来调用。
尤其值得大家学习的是使用了DllCall,它的使用对我们还比较新鲜,请仔细学习。

AutoItSetOption("WinTitleMatchMode", 4);2 = Match any substring in the title

$h = GetWindowHandles()
$dataout=""
For $i = 1 to $h[0]
$title=WinGetTitle("handle="&$h[$i])
$dataout=$dataout&$h[$i]&"--->"&$title& @CRLF
Next
MsgBox(1,"Windows",$dataout)

Func GetWindowHandles()
$GW_HWNDNEXT = 2
$GW_CHILD = 5
Dim $List[1]
$List[0]=0

$x = DLLCall("user32.dll","hwnd","GetDesktopWindow")
if @error Then Return $List
$x = DLLCall("user32.dll","hwnd","GetWindow","hwnd",$x[0],"int",$GW_CHILD)
if @error Then Return $List

While 1
  $x = DLLCall("user32.dll","hwnd","GetWindow","hwnd",$x[0],"int",$GW_HWNDNEXT)
  if @error Then ExitLoop
  If String($x[0]) = "00000000" Then ExitLoop
  If BitAnd(WinGetState($x[0]),2) Then
     $ub = Ubound($List)
     Redim $List[$ub+1]
     $List[$ub]=$x[0]
     $List[0]=$ub
  EndIf
WEnd  
Return $List
EndFunc

下面是另一个调用这个程序的应用,对所有当前窗体设置透明度。
注意使用这个程序后,自己修改透明度好再恢复。


$h = GetWindowHandles()
For $i = 1 to $h[0]
WinSetTrans($h[$i],"", 100)
Next

Func GetWindowHandles()
$GW_HWNDNEXT = 2
$GW_CHILD = 5
Dim $List[1]
$List[0]=0

$x = DLLCall("user32.dll","hwnd","GetDesktopWindow")
if @error Then Return $List
$x = DLLCall("user32.dll","hwnd","GetWindow","hwnd",$x[0],"int",$GW_CHILD)
if @error Then Return $List

While 1
   $x = DLLCall("user32.dll","hwnd","GetWindow","hwnd",$x[0],"int",$GW_HWNDNEXT)
   if @error Then ExitLoop
   If String($x[0]) = "00000000" Then ExitLoop
   If BitAnd(WinGetState($x[0]),2) Then
      $ub = Ubound($List)
      Redim $List[$ub+1]
      $List[$ub]=$x[0]
      $List[0]=$ub
   EndIf
WEnd   
Return $List
EndFunc

DllCall命令,是调用dll动态连接库里已有的功能函数。其格式是
DllCall ( "dll文件", "返回值类型", "功能", "参数类型", 参数 )

虽然帮助文件里在介绍格式时,没有说明是否可以有省略的参数,但从上面的例子中一句
$x = DLLCall("user32.dll","hwnd","GetDesktopWindow")
可以看出,在特定使用时,可以省略后两项。

DllCall的使用是要看具体的dll和dll中具体的功能及使用方法来定的。我没有研究我user32.dll里的功能,但从上面的例子来看,可以简单解释一下。

在user32.dll中,有函数GetDesktopWindow和GetWindow
GetDesktopWindow的功能是取得桌面的句柄
GetWindow的功能是取得窗体的句柄,其中,在赋整形值5时,返回第一个窗体的句柄;在赋整形值2时,返回下一个窗体的句柄。这点比较类型FileFindFirstFile和FileFindNextFile
用循环的方式取得所有窗体的句柄,直到String($x[0]) = "00000000"。
并非所有窗体都是可见的,我们需要的只是可见的,所以BitAnd(WinGetState($x[0]),2),过滤出可见的窗体。
最后用$title=WinGetTitle("handle="&$h[$i])取得可见窗体的标题。
发表于 2008-5-10 15:27:11 | 显示全部楼层
好复杂,偶还是小菜,看不懂,努力,努力学习。。。。
发表于 2008-5-12 21:33:02 | 显示全部楼层
努力,努力学习。。。。           
发表于 2009-6-18 23:34:21 | 显示全部楼层
发表于 2009-8-20 15:29:46 | 显示全部楼层
关于USER32.DLL的用户库函数请查看

http://www.delphijs.net/Articled ... WFL/200810/326.html
发表于 2009-9-30 12:28:11 | 显示全部楼层
看不懂,努力,努力学习。。。。
发表于 2009-10-11 10:58:33 | 显示全部楼层
嗯,不过。在帮助文档里参数是可选的有说哦
唉,还是对DllCall这个东西很模糊
发表于 2010-1-27 11:30:12 | 显示全部楼层
唉,对DllCall这个东西很模糊. 努力学习
发表于 2010-1-27 13:46:48 | 显示全部楼层
谢谢楼上分享!!!!!!
发表于 2010-2-9 14:48:02 | 显示全部楼层
看一下,谢谢
发表于 2010-2-19 10:23:41 | 显示全部楼层
有一个地方把函数翻译成功能了。
发表于 2010-2-19 13:19:02 | 显示全部楼层
看起来好难呀
发表于 2010-2-19 14:31:29 | 显示全部楼层
嗯,不过。在帮助文档里参数是可选的有说哦
唉,还是对DllCall这个东西很模糊
a1986040444 发表于 2009-10-11 10:58



    嗯,对DllCall说的很模糊,什么参数1,值1。。。
发表于 2010-2-21 08:17:22 | 显示全部楼层
其实你可以这样理解  调用某类函数的某个函数, 需要它哪个属性就选择哪个参数
发表于 2010-2-21 18:55:37 | 显示全部楼层
主要是DLL函数的介绍模糊,就算知道怎么用,也不知道什么东西需要那个来写。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-22 22:46 , Processed in 0.106652 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表