找回密码
 加入
搜索
查看: 8942|回复: 14

[IE类操作] [已解决]如何取得IE客户区的句柄进行后台取色呢

 火.. [复制链接]
发表于 2011-1-2 16:19:05 | 显示全部楼层 |阅读模式
本帖最后由 lon91ong 于 2011-1-4 13:38 编辑

lanfengc大侠给出过的后台取色工具中包含了下面的函数,用来对窗口抓图
我现在想要修改成对IE窗口中的客户区抓图,不是整个窗口抓图,请问大侠要如何修改呢?
Func _WinCapture($hWnd, $iWidth = -1, $iHeight = -1)
        ;定义程序必须的变量
        Local $iH, $iW, $hDDC, $hCDC, $hBMP
        ;如果调用该函数时候没指定宽和高,则调用AIP获取窗口的宽和高作为抓图区域的宽和高
        If $iWidth = -1 Then $iWidth = _WinAPI_GetWindowWidth($hWnd)
        If $iHeight = -1 Then $iHeight = _WinAPI_GetWindowHeight($hWnd)
        ;创建一个DC句柄
    $hDDC = _WinAPI_GetDC($hWnd)
        ;创建一个与DC句柄兼容的内存句柄
    $hCDC = _WinAPI_CreateCompatibleDC($hDDC)
        ;从DC句柄创建一个宽高为调用值的位图句柄
    $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight)
        ;将位图句柄复制到内存区域中去
    _WinAPI_SelectObject($hCDC, $hBMP)
        ;用 printwindow 取得程序窗口
    DllCall("User32.dll", "int", "PrintWindow", "hwnd", $hWnd, "hwnd", $hCDC, "int", 0)
        ;释放DC句柄
    _WinAPI_ReleaseDC($hWnd, $hDDC)
        ;释放内存句柄
    _WinAPI_DeleteDC($hCDC)
;~     _ScreenCapture_SaveImage(@DesktopDir&"\window.jpg", $hBMP)
    ;返回创建好的位图句柄
    Return $hBMP
EndFunc 
发表于 2011-1-2 17:07:32 | 显示全部楼层

#include <winapi.au3>
#include <GdiPlus.au3>

$Hwnd = WinGetHandle("[CLASS:IEFrame]");取IE句柄,请确认IE窗口存在
_WinAPI_PrintScreenWithHwnd($Hwnd,200,200)

Func _WinAPI_PrintScreenWithHwnd($Hwnd, $iWidth = 0, $iHeight = 0, $sFileName = 0)
        
        ;参数: 
        ;$Hwnd,目标窗口句柄.$sFileName(可选),要保存的文件路径,默在脚本目录
        
        ;返回值:
        ;成功,返回文件名
        ;失败,返回值为0,说明目标窗口被最小化,返回值为-1,说明给定的句柄不是一个有效的windows窗口
        
        If Not $sFileName Then $sFileName = @ScriptDir & "\截图.png"
        If IsIconic($Hwnd) Then Return SetError(-1, 0, 0)
        If Not (_WinAPI_IsWindow($Hwnd)) Then Return SetError(-2, 1, -1)
        _GDIPlus_Startup()
        $hDC = _WinAPI_GetDC($Hwnd)
        If Not $iWidth Then $iWidth = _WinAPI_GetWindowWidth($hWnd)
        If Not $iHeight Then $iHeight = _WinAPI_GetWindowHeight($hWnd)
        $hBMP = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
        $memDC = _WinAPI_CreateCompatibleDC($hDC)
        _WinAPI_SelectObject($memDC, $hBMP)
        _WinAPI__PrintWindow($Hwnd, $memDC, 0)
        $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)
        _GDIPlus_ImageSaveToFile($hImage, $sFileName)
        _WinAPI_ReleaseDC($Hwnd, $hDC)
        _WinAPI_DeleteDC($memDC)
        _GDIPlus_Shutdown()
        Return SetError(0, 2, $sFileName)
EndFunc   ;==>_WinAPI_PrintScreenWithHwnd

Func _WinAPI__PrintWindow($Hwnd, $hDC, $nFlags = 0)
        Local $aResult = DllCall("user32.dll", "bool", "PrintWindow", "hwnd", $Hwnd, "handle", $hDC, "int", $nFlags)
        If @error Then Return SetError(@error, @extended, 0)
        Return $aResult[0]
EndFunc   ;==>_WinAPI__PrintWindow

Func IsIconic($Hwnd)
        Local $nResult = DllCall("user32.dll", "int", "IsIconic", "hwnd", $Hwnd)
        Return $nResult[0]
EndFunc   ;==>IsIconic

评分

参与人数 1金钱 +15 收起 理由
lon91ong + 15 版主我真是太感激你了!

查看全部评分

 楼主| 发表于 2011-1-2 17:17:41 | 显示全部楼层
太感激版主了!再一次帮了我大忙!
 楼主| 发表于 2011-1-2 17:27:57 | 显示全部楼层
刚才没试,现在试了一下,发现还是不对啊,我要的不是这个效果的截图
我想要的是不包括窗口框架的截图,只是网页区域的截图
[CLASS:Internet Explorer_Server; INSTANCE:1]

大侠帮忙!
发表于 2011-1-2 20:04:12 | 显示全部楼层
刚才没试,现在试了一下,发现还是不对啊,我要的不是这个效果的截图
我想要的是不包括窗口框架的截图,只是网 ...
lon91ong 发表于 2011-1-2 17:27

拜读了一下lanfengc大侠的那个贴子,改了一下返回值.
下这的这个代码应该是你要的
运行结果如图:
  
代码:

#include <winapi.au3>
#include <GdiPlus.au3>

$Hwnd = WinGetHandle("Google - Chromium", "");Chrom句柄
_WinAPI_PrintScreenWithHwnd($Hwnd, 551, 288, 188, 33)

Func _WinAPI_PrintScreenWithHwnd($Hwnd, $iLeft = 0, $iTop = 0, $iWidth = @DesktopWidth, $iHeight = @DesktopHeight, $iFormat = $GDIP_PXF32RGB)
        
        ;参数:
        ;$Hwnd     目标窗口句柄.$sFileName(可选),要保存的文件路径,默在脚本目录
        ;$iLeft    X座标的距离.
        ;$iTop     Y座标的距离.
        ;$iWidth,  图片的宽度
        ;$iHeight  图片的高度
        ;$iFormat  图片的色深
        ;具体定义参考_GDIPlus_BitmapCloneArea()
        ;--------------------------
        ;返回值:
        ;成功,返回位图句柄
        ;失败,返回值为0,说明目标窗口被最小化,返回值为-1,说明给定的句柄不是一个有效的windows窗口.返回值为-2,说明目标窗口不可绘

        If IsIconic($Hwnd) Then Return SetError(-1, 0, 0)
        If Not (_WinAPI_IsWindow($Hwnd)) Then Return SetError(-2, 1, -1)
        _GDIPlus_Startup()
        $hDC = _WinAPI_GetDC($Hwnd)
        $hBMP = _WinAPI_CreateCompatibleBitmap($hDC, _WinAPI_GetWindowWidth($Hwnd), _WinAPI_GetWindowHeight($Hwnd)) ;创建位图,大小为目标窗口的高度及宽度
        $memDC = _WinAPI_CreateCompatibleDC($hDC)
        _WinAPI_SelectObject($memDC, $hBMP)
        _WinAPI__PrintWindow($Hwnd, $memDC, 0)
        $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)
        If @error Then Return SetError(-3, 2, -2)
        $hClone = _GDIPlus_BitmapCloneArea($hImage, $iLeft, $iTop, $iWidth, $iHeight, $iFormat)
        _GDIPlus_ImageSaveToFile($hClone, @ScriptDir & "\截图.png") ;保存图片
        ;_GDIPlus_ImageDispose($hClone)
        _GDIPlus_ImageDispose($hImage)
        _WinAPI_ReleaseDC($Hwnd, $hDC)
        _WinAPI_DeleteDC($memDC)
        _GDIPlus_Shutdown()
        Return SetError(0, 2, $hClone);返回位图句柄
EndFunc   ;==>_WinAPI_PrintScreenWithHwnd

Func _WinAPI__PrintWindow($Hwnd, $hDC, $nFlags = 0)
        Local $aResult = DllCall("user32.dll", "bool", "PrintWindow", "hwnd", $Hwnd, "handle", $hDC, "int", $nFlags)
        If @error Then Return SetError(@error, @extended, 0)
        Return $aResult[0]
EndFunc   ;==>_WinAPI__PrintWindow

Func IsIconic($Hwnd)
        Local $nResult = DllCall("user32.dll", "int", "IsIconic", "hwnd", $Hwnd)
        Return $nResult[0]
EndFunc   ;==>IsIconic

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +12 收起 理由
lon91ong + 12

查看全部评分

发表于 2011-1-2 20:05:31 | 显示全部楼层
是截图.png.分辨率为1280*1024
发表于 2011-1-2 20:31:45 | 显示全部楼层
能不能后台截取指定区域的图呢?例如区域(200,300,500,800)
发表于 2011-1-2 20:34:36 | 显示全部楼层
5#的代码就是.只要窗口不被最小化都能操作
 楼主| 发表于 2011-1-2 22:17:56 | 显示全部楼层
回复 8# ceoguang


  但是lanfengc大侠得那个后台取色最小化也可以的呀!

我想的是怎么能把lanfengc大侠的_WinCapture函数修改一下,可以再进一步接收目标窗口内某个控件的句柄,只对该控件截图
IE窗口的话就是[CLASS:Internet Explorer_Server; INSTANCE:1]控件
发表于 2011-1-8 17:02:53 | 显示全部楼层
高人应该做一个 后台取色的UDF 造福后人啊
哈哈哈哈

不过还是喜欢对 元素控制
发表于 2011-11-17 11:05:53 | 显示全部楼层
学习了,准备用在外挂上
发表于 2012-2-5 21:18:18 | 显示全部楼层
不错,标注,非常好。
发表于 2013-11-10 17:24:38 | 显示全部楼层
回复 9# lon91ong

先用ControlGetPos得知該控件位置大小,在代入 _WinAPI_PrintScreenWithHwnd($Hwnd, $iLeft = 0, $iTop = 0, $iWidth = @DesktopWidth, $iHeight = @DesktopHeight, $iFormat = $GDIP_PXF32RGB)

就可以對該控件截圖了
发表于 2017-5-21 14:53:48 | 显示全部楼层
绝对好的代码
发表于 2017-5-23 00:46:11 | 显示全部楼层
不敢细看——修行不够,很多看不懂,但却正是我想要做的事
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-17 03:24 , Processed in 0.075553 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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