找回密码
 加入
搜索
查看: 2157|回复: 12

[网络通信] 【已解决】PixelGetColor 为什么在不同电脑,相同位置采取的点颜色不一样

[复制链接]
发表于 2021-4-11 18:15:18 | 显示全部楼层 |阅读模式
本帖最后由 itzyx 于 2021-4-12 12:35 编辑

写了一个小程序,监控目标窗口的状态变化,用的是A大指导的 PixelGetColor 函数 抓取窗口相对位置十个点颜色作比较的方法,在我自己电脑上 测试完成可以。但是有天换成笔记本测试就不行了;我一开始以为笔记本分辨率的问题,但是后来 换成另一台式电脑居然也不行。
用A大的工具PixelCatcher 测试了一下,发现同个位置的窗口相对坐标,居然在其它电脑读取的颜色不一样,所以才导致无法识别窗口状态的变化;下面是截取的部分代码
Opt('PixelCoordMode', 0)

$Handle=WinGetHandle('目标窗口')

While WinExists($Handle)
        If PixelGetColor(1317, 1032, $Handle) = '15772512' And PixelGetColor(1317, 1033, $Handle) = '6291510' And PixelGetColor(1316, 1033, $Handle) = '15790251' And PixelGetColor(1318, 1038, $Handle) = '11268336' And PixelGetColor(1318, 1039, $Handle) = '0' _
                                        And PixelGetColor(1321, 1037, $Handle) = '3573710' And PixelGetColor(1320, 1037, $Handle) = '13535030' And PixelGetColor(1320, 1033, $Handle) = '8861184' And PixelGetColor(1317, 1032, $Handle) = '15772512' Then
                                $hTimer = TimerInit()
                                Do
                                        ToolTip('设备无帧率', 0, 0, "错误", 3) ;设备无帧率
                                        Sleep(1000)
                                        ToolTip('')
                                        Sleep(500)
                                Until Not WinExists($Handle) Or PixelGetColor(1317, 1032, $Handle) <> '15772512' Or PixelGetColor(1317, 1033, $Handle) <> '6291510' Or PixelGetColor(1316, 1033, $Handle) <> '15790251' Or PixelGetColor(1318, 1038, $Handle) <> '11268336' Or PixelGetColor(1318, 1039, $Handle) <> '0' _
                                                Or PixelGetColor(1321, 1037, $Handle) <> '3573710' Or PixelGetColor(1320, 1037, $Handle) <> '13535030' Or PixelGetColor(1320, 1033, $Handle) <> '8861184' Or PixelGetColor(1317, 1032, $Handle) <> '15772512'
                                IniWrite(@ScriptDir & '\状态日志.log', '设备无帧率', @YEAR & '/' & @MON & '/' & @MDAY & '-' & @HOUR & ':' & @MIN & ':' & @SEC & '(结束时间)', Round(TimerDiff($hTimer) / 1000) & 's(时长)')
        EndIf
        WEnd
所以想问问A大还有各位大佬 ,PixelGetColor 在相同位置采取的点颜色不一样,是我自己设置的问题,还是哪里出问题了? 我头大了都想不出来  ,万分感谢!
发表于 2021-4-11 18:20:36 | 显示全部楼层
本帖最后由 fybhwsx 于 2021-4-11 18:22 编辑

系统透明效果就是采色杀手,关了试试。。
        RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize', 'SystemUsesLightTheme', 'REG_DWORD', '0') ;应用背景模式深色
        RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize', 'AppsUseLightTheme', 'REG_DWORD', '0') ;应用模式深色
        RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize', 'EnableTransparency', 'REG_DWORD', '0') ;关闭透明效果
发表于 2021-4-11 18:26:11 | 显示全部楼层
1,相对窗口的坐标不一定是同一位置,根据系统或主题的不同,坐标有差异也很正常,因此,最好使用控件坐标。
2,标准控件在不同系统或主题下形状及颜色有差异也很正常
3,系统进行了缩放,DPI不同,位置、颜色都会有差异。

解决这些问题最直接的方式:在当前的系统环境下采点,不要东采西用(除非确定以上提到到的场景条件均一致)。

评分

参与人数 1金钱 +30 收起 理由
itzyx + 30 感谢A大细心指导 !

查看全部评分

 楼主| 发表于 2021-4-11 20:43:35 | 显示全部楼层
afan 发表于 2021-4-11 18:26
1,相对窗口的坐标不一定是同一位置,根据系统或主题的不同,坐标有差异也很正常,因此,最好使用控件坐标 ...

那就尴尬了,我还以为能一劳永逸呢,我确认了问题所在,应该就是A大你说的,相对窗口的坐标不一定是同一位置,估计我要重新想方法了,因为后面换电脑可能比较频繁,没办法每次都重新采色  
 楼主| 发表于 2021-4-11 20:44:26 | 显示全部楼层
fybhwsx 发表于 2021-4-11 18:20
系统透明效果就是采色杀手,关了试试。。

好的,谢谢大佬,不过我的问题 八九不离十 应该是相同坐标 位置不同了
发表于 2021-4-12 11:19:54 | 显示全部楼层
解决了就及时结贴,好习惯很难吗?
p.s, 一楼的代码有效率和CPU占用问题。另外,这样写起来、维护起来会吐血……
 楼主| 发表于 2021-4-12 11:50:19 | 显示全部楼层
本帖最后由 itzyx 于 2021-4-12 11:54 编辑
afan 发表于 2021-4-11 18:26
1,相对窗口的坐标不一定是同一位置,根据系统或主题的不同,坐标有差异也很正常,因此,最好使用控件坐标 ...

A大我现在想通过获取这个控件文本,来判断窗口状态,获取控件类:TreeList1
下面是脚本:
#include <GuiTreeView.au3>
WinActivate('目标窗口')
$Whandle = ControlGetHandle("目标窗口", "", "TreeList1")
ControlTreeView("目标窗口","", "TreeList1",'Select','#0|#0')
$hItem=_GUICtrlTreeView_GetSelection($Whandle)
$text1=_GUICtrlTreeView_GetText($Whandle,$hItem)
MsgBox(0,'',$text1)

但是获取到的文本内容为空。 能帮忙看下如何获取这个对应的文本吗 ,感谢!不好意思A大,我一般都有好习惯的,解决立马更改标题,这次特殊, 还有这个效率和CPU占用问题是因为什么原因啊(维护确实麻烦)。。。


本帖子中包含更多资源

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

×
发表于 2021-4-12 11:55:57 | 显示全部楼层
itzyx 发表于 2021-4-12 11:50
A大我现在想通过获取这个控件文本,来判断窗口状态,获取控件类:TreeList1
下面是脚本:

这是与主题无关的问题。
 楼主| 发表于 2021-4-12 12:09:15 来自手机 | 显示全部楼层
afan 发表于 2021-4-12 11:55
这是与主题无关的问题。

我的问题,想着方便一起问了,下次一定注意,给A大添麻烦了
发表于 2021-4-12 12:22:27 | 显示全部楼层
itzyx 发表于 2021-4-12 12:09
我的问题,想着方便一起问了,下次一定注意,给A大添麻烦了

没有给我添麻烦,只是不方便后来搜索问题者而已~
获取文本的问题,一般不是windows标准控件都无法通过常规方式获取。
检验方法是否正确可以用含有标准控件的窗口进行测试,如果能正常获取就说明方法没问题。
发表于 2021-4-12 12:31:23 | 显示全部楼层
itzyx 发表于 2021-4-12 11:50
A大我现在想通过获取这个控件文本,来判断窗口状态,获取控件类:TreeList1
下面是脚本:
这个效率和CPU占用问题是因为什么原因啊(维护确实麻烦)

目测在循环过程中始终无休止 WinExists PixelGetColor,你可以在执行时查看CPU占用。
代码不是写在一行就有效率的,反而会增加维护成本。
另外,相同的数据多次引用,最好使用变量,这样只需修改一处就能同时改变了多处引用。比如,数据用数组:
Global $aPC[9][4] = [ _
                [1317, 1032, $Handle, 15772512], _
                [1317, 1033, $Handle, 6291510], _
                [1316, 1033, $Handle, 15790251], _
                [1318, 1038, $Handle, 11268336], _
                [1318, 1039, $Handle, 0], _
                [1321, 1037, $Handle, 3573710], _
                [1320, 1037, $Handle, 13535030], _
                [1320, 1033, $Handle, 8861184], _
                [1317, 1032, $Handle, 15772512]]
检测时用循环即可
Func _CkColor()
        If Not WinExists($Handle) Then Return False
        Local $ii
        For $ii = 0 To UBound($aPC) - 1
                If PixelGetColor($aPC[$ii][0], $aPC[$ii][1], $aPC[$ii][2]) <> $aPC[$ii][3] Then Return False
        Next
        Return True
EndFunc   ;==>_CkColor
养成好的代码书写习惯和逻辑很重要。
 楼主| 发表于 2021-4-12 12:34:54 | 显示全部楼层
afan 发表于 2021-4-12 12:22
没有给我添麻烦,只是不方便后来搜索问题者而已~
获取文本的问题,一般不是windows标准控件都无法通过常 ...

好的,这个控件可以通过Au3.WProbe 获取到,获取的是 TreeList1, 因为我不清楚树状列表子项后面的文本 有什么办法获取(比如 状态对应的:未连接,或者预览)所以想请教A大, 我现在就重新发帖
 楼主| 发表于 2021-4-12 12:39:08 | 显示全部楼层
afan 发表于 2021-4-12 12:31
目测在循环过程中始终无休止 WinExists PixelGetColor,你可以在执行时查看CPU占用。
代码不是写在一 ...

好的,因为确实0基础学习,不能很好的灵活应用函数, 后面肯定慢慢完善 , 实在感谢A大的细心指导, 受益匪浅
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 22:32 , Processed in 0.079119 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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