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

win7以上系统取色函数PixelGetColor移动鼠标检测时速度非常慢,求方法!

[复制链接]
发表于 2023-9-21 19:43:50 | 显示全部楼层 |阅读模式
本帖最后由 hlzxcjx 于 2023-9-23 22:25 编辑
For $x = 0 To 200
        $var = PixelGetColor($x, 300)
        MouseMove($x, 300, 0)
Next
MsgBox(0, 0, "ok")
以上代码在xp系统瞬息可完成,在win7系统中鼠标移动非常缓慢,但结束桌面窗口管理进程dwm.exe后(需结束两次以上才能结束dwm.exe进程),鼠标移动也可瞬息完成。但在win11系统中由于系统特性无法结束dwm.exe进程,这时PixelSearch函数就无法使用了!求解决方法!

发表于 2023-9-21 23:27:21 | 显示全部楼层
可以截屏后对图片上的坐标取色。这样就不存在数秒的延迟了。
发表于 2023-9-21 23:23:08 | 显示全部楼层
和鼠标移动无关。
注释掉鼠标移动,速度依然非常慢。
Local $hTimer = TimerInit()
For $x = 0 To 200
        $var = PixelGetColor($x, 300)
        MouseMove($x, 300, 0)
Next
MsgBox(0, 0, TimerDiff($hTimer))
 楼主| 发表于 2023-9-22 06:46:38 | 显示全部楼层
gyp2000 发表于 2023-9-21 23:27
可以截屏后对图片上的坐标取色。这样就不存在数秒的延迟了。

这样就不方便了,界面在不断变化,我设计的程序是每分每秒在不断检测颜色的!
发表于 2023-9-22 07:53:12 | 显示全部楼层
; 预先定义一个固定大小的数组用于存储像素颜色
Local $pixelColors[201]

; 设置鼠标坐标模式为相对于屏幕(0 = 相对于屏幕,1 = 相对于活动窗口,2 = 相对于客户端区域)
Opt("MouseCoordMode", 0)

; 开始计时
Local $timerStart = TimerInit()

; 遍历 x = 0 到 200 的每一个值
For $x = 0 To 200
    ; 使用 PixelGetColor 获取 (x, 300) 坐标处的像素颜色
    $pixelColors[$x] = PixelGetColor($x, 300)
Next

; 停止计时并计算耗时
Local $duration = TimerDiff($timerStart)

; 输出耗时信息
ConsoleWrite("Time taken: " & $duration & " ms" & @CRLF)

; 在最后再移动鼠标
MouseMove(200, 300, 0)

; 显示一个消息框,表示任务完成
MsgBox(0, "Status", "OK")  
发表于 2023-9-22 18:48:50 | 显示全部楼层
现在还有这个问题吗?
12年前我也问过,后面应该是换方案了:https://www.autoitx.com/thread-28942-1-1.html
 楼主| 发表于 2023-9-22 20:25:44 | 显示全部楼层
rdw167 发表于 2023-9-22 07:53
; 预先定义一个固定大小的数组用于存储像素颜色
Local $pixelColors[201]

一样,还是慢!
 楼主| 发表于 2023-9-22 20:26:42 | 显示全部楼层
zch11230 发表于 2023-9-22 18:48
现在还有这个问题吗?
12年前我也问过,后面应该是换方案了:https://www.autoitx.com/thread-28942-1-1.h ...

这里都没有解决方案!
发表于 2023-9-23 22:13:25 | 显示全部楼层
Aero桌面导致的,可以试着关闭Aero桌面

; 以下为检测OS,如果是win7则临时关闭Aero桌面 ==================================================

Func check_win7()

        If _DwmIsEnabled() = True Then DllCall("dwmapi.dll", "uint", "DwmEnableComposition", "int", 'False')

EndFunc

Func _DwmIsEnabled()
    If FileExists(@SystemDir & "\dwmapi.dll") Then
        $Receiver = DllStructCreate("int")
        $aTemp = DllCall("dwmapi.dll", "uint", "DwmIsCompositionEnabled", "ptr", DllStructGetPtr($Receiver, 1))

        $Receiver2 = DllStructCreate("int", $aTemp[1])
        If DllStructGetData($Receiver2, 1) = True Then
            Return 1
        Else
            Return SetError(1, 0, 0)
        EndIf
    Else
        Return SetError(2, 0, 0)
    EndIf
EndFunc
 楼主| 发表于 2023-9-23 22:31:31 | 显示全部楼层
opq6789 发表于 2023-9-23 22:13
Aero桌面导致的,可以试着关闭Aero桌面

; 以下为检测OS,如果是win7则临时关闭Aero桌面 =============== ...

没有效果!而且你这个是针对win7的,win10、win11没有Aero桌面的设置。其实win7中如果不结束dwm.exe进程,选择经典主题也有效果,但win10、win11都没有经典主题模式!
发表于 2023-9-25 08:27:53 | 显示全部楼层
所谓的瞬息完成,总得有个时间参考
你搞个时间差, 看看瞬息是多久,然后win10,win11是多久。
发表于 2023-9-25 08:29:38 | 显示全部楼层
win10测试3.3秒
发表于 2023-9-25 09:41:42 | 显示全部楼层
刚搜索了一下,GetPixel函数在win10里面,确实有很大延迟,和au3无关,任何语言都有这个问题。他们的解决方案是,把整个区域放入内存,以位图的形式检测颜色。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-2 02:15 , Processed in 0.082505 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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