前言
-
最近在开发一个pc自动化程序,使用易语言调用大漠去实现
-
使用前台模式截图是正常的,使用后台截图却不行,用“大漠插件绑定测试工具”调整各种后台参数后测试同样也行不通
-
本以为是大漠的问题,后面测试了乐玩模块发现也同样是黑屏,那就是单纯截屏的问题了,还是要从这方面入手
-
在论坛上看到一个帖子,用python的某些代码可以实现后台截图,某大佬从易语言超级模块中剥离出截屏代码,并按照python代码修改了,于是可以实现后台截屏了,缺点就是不能最小化和隐藏窗口,但终究还是实现了,代码下载:点我下载
-
然而,问题还是没有解决,因为大漠的截屏代码是内置的,你没法直接用上面的截屏代码替换掉大漠的截屏代码。没法替换,就意味着还是黑屏,就好比一个盲人一样,看不见,无法执行其他操作
思路
那个下午我找了很多资料,都没有很有效的方法。躺在床上小憩了一下,突然灵光一闪:盲人既然可以依靠导盲犬,那我是不是也可以给程序也造一个“导盲犬”?而这个“导盲犬”就是上面修改后的截屏代码。那么思路就来了:
首先讲下我程序的自动化目标,一个网页。下面的部分是我程序渲染某网页的区域,而恰恰是这部分会导致大漠截图黑屏,其它部分就不会。
至于原因,上网查的资料说网页没法在后台渲染才导致的截屏黑屏,测试了下,如果把下面的网页区域换成一个图片框展示某图片那么后台截屏就正常。
所以主要思路就是:
程序界面添加一个图片框,后台截屏后将截屏的图片设置到图片框上,然后大漠再去识别图片框,识别完后再去操作网页
具体实现
- 在网页渲染区域上放置一个图片框,具体要求:
- 大小相同且重叠:这样才可以把图片框上识别到的xy坐标一一映射到对应的网页区域上
- 可视设置为假:这样在展示的时候会仅显示网页区域
- 名称设置为投屏框
- 定义两个程序集变量:
- 操作句柄:即网页区域的句柄
- 投屏句柄:即图片框的句柄
需要注意的是取句柄的方式,最好不要通过类名直接取,否侧多开的时候就会同时存在多个相同的类名,目标句柄就无法准确获取,可能会冲突。
.版本 2
操作句柄 = Edge.取窗口句柄 ()
投屏句柄 = 窗口_取祖句柄 (操作句柄)
操作句柄 = 窗口_取句柄_递归 (操作句柄, “Chrome_RenderWidgetHostHWND”)
投屏句柄 = 窗口_取句柄_递归 (投屏句柄, “_EL_PicBox”)
- 定义两个程序
- 操作句柄切换投屏句柄
功能:将投屏框的可视化设置为真,设置投屏框的图片为后台截图代码所截的图片,解绑原来的句柄并绑定投屏句柄,延迟一定要加! - 投屏句柄切换操作句柄
功能:将投屏框的可视化设置为假,解绑原来的句柄并绑定操作句柄,延迟一定要加!
- 操作句柄切换投屏句柄
键鼠操作、图色识别、后台截图都是需要设置相应句柄的,在程序执行过程中需要频繁按需切换,因此将其封装成函数。
而对于频繁的设置投屏框的可视属性是因为:当可视为假时无法绑定识别,可视为真时无法操作网页区域,因此也需要频繁按需切换。
.版本 2
.子程序 操作句柄切换投屏句柄
.如果真 (组合框_模式选择.现行选中项 = 0)
投屏框.可视 = 假
投屏框.图片 = 窗口截图 (操作句柄)
投屏框.可视 = 真
dwy.delay (100, 100)
.如果真 (dwy.BindWindow (投屏句柄, “gdi2”, “windows3”, “normal”, “”, 2) ≠ 1)
信息框 (“窗口绑定失败!”, 0, , )
返回 ()
.版本 2
.子程序 投屏句柄切换操作句柄
.如果真 (组合框_模式选择.现行选中项 = 0)
投屏框.可视 = 假
dwy.delay (100, 100)
dwy.UnBindWindow ()
.如果真 (dwy.BindWindow (操作句柄, “gdi2”, “windows3”, “normal”, “”, 2) ≠ 1)
信息框 (“窗口绑定失败!”, 0, , )
返回 ()
.如果真结束
- 应用:
当要进行图色识别时,调用 “操作句柄切换投屏句柄()”
当要进行键鼠操作时,调用 “投屏句柄切换操作句柄()”
效果
可以通过界面右侧的日志可以知道,即使我将网页区域都遮挡住,依旧可以进行图色识别和键鼠操作!