itzyx 发表于 2021-4-11 18:15:18

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

本帖最后由 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 在相同位置采取的点颜色不一样,是我自己设置的问题,还是哪里出问题了? 我头大了都想不出来,万分感谢!

fybhwsx 发表于 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') ;关闭透明效果

afan 发表于 2021-4-11 18:26:11

1,相对窗口的坐标不一定是同一位置,根据系统或主题的不同,坐标有差异也很正常,因此,最好使用控件坐标。
2,标准控件在不同系统或主题下形状及颜色有差异也很正常
3,系统进行了缩放,DPI不同,位置、颜色都会有差异。

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

itzyx 发表于 2021-4-11 20:43:35

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

那就尴尬了,我还以为能一劳永逸呢,我确认了问题所在,应该就是A大你说的,相对窗口的坐标不一定是同一位置,估计我要重新想方法了,因为后面换电脑可能比较频繁,没办法每次都重新采色

itzyx 发表于 2021-4-11 20:44:26

fybhwsx 发表于 2021-4-11 18:20
系统透明效果就是采色杀手,关了试试。。

好的,谢谢大佬,不过我的问题 八九不离十 应该是相同坐标 位置不同了

afan 发表于 2021-4-12 11:19:54

解决了就及时结贴,好习惯很难吗?
p.s, 一楼的代码有效率和CPU占用问题。另外,这样写起来、维护起来会吐血……

itzyx 发表于 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占用问题是因为什么原因啊(维护确实麻烦)。。。


afan 发表于 2021-4-12 11:55:57

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



这是与主题无关的问题。

itzyx 发表于 2021-4-12 12:09:15

afan 发表于 2021-4-12 11:55
这是与主题无关的问题。

我的问题,想着方便一起问了,下次一定注意,给A大添麻烦了

afan 发表于 2021-4-12 12:22:27

itzyx 发表于 2021-4-12 12:09
我的问题,想着方便一起问了,下次一定注意,给A大添麻烦了

没有给我添麻烦,只是不方便后来搜索问题者而已~
获取文本的问题,一般不是windows标准控件都无法通过常规方式获取。
检验方法是否正确可以用含有标准控件的窗口进行测试,如果能正常获取就说明方法没问题。

afan 发表于 2021-4-12 12:31:23

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



这个效率和CPU占用问题是因为什么原因啊(维护确实麻烦)
目测在循环过程中始终无休止 WinExists PixelGetColor,你可以在执行时查看CPU占用。
代码不是写在一行就有效率的,反而会增加维护成本。
另外,相同的数据多次引用,最好使用变量,这样只需修改一处就能同时改变了多处引用。比如,数据用数组:
Global $aPC = [ _
                , _
                , _
                , _
                , _
                , _
                , _
                , _
                , _
                ]
检测时用循环即可
Func _CkColor()
        If Not WinExists($Handle) Then Return False
        Local $ii
        For $ii = 0 To UBound($aPC) - 1
                If PixelGetColor($aPC[$ii], $aPC[$ii], $aPC[$ii]) <> $aPC[$ii] Then Return False
        Next
        Return True
EndFunc   ;==>_CkColor
养成好的代码书写习惯和逻辑很重要。

itzyx 发表于 2021-4-12 12:34:54

afan 发表于 2021-4-12 12:22
没有给我添麻烦,只是不方便后来搜索问题者而已~
获取文本的问题,一般不是windows标准控件都无法通过常 ...

好的,这个控件可以通过Au3.WProbe 获取到,获取的是 TreeList1, 因为我不清楚树状列表子项后面的文本 有什么办法获取(比如 状态对应的:未连接,或者预览)所以想请教A大, 我现在就重新发帖

itzyx 发表于 2021-4-12 12:39:08

afan 发表于 2021-4-12 12:31
目测在循环过程中始终无休止 WinExists PixelGetColor,你可以在执行时查看CPU占用。
代码不是写在一 ...

好的,因为确实0基础学习,不能很好的灵活应用函数, 后面肯定慢慢完善 , 实在感谢A大的细心指导, 受益匪浅
页: [1]
查看完整版本: 【已解决】PixelGetColor 为什么在不同电脑,相同位置采取的点颜色不一样