爱体育

 
 加入
查看: 227|回复: 12

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

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

发表于 2023-9-21 23:23:08 | 显示全部楼层
和鼠标移动无关。
注释掉鼠标移动,速度依然非常慢。
  1. local $htimer = timerinit()
  2. for $x = 0 to 200
  3.         $var = pixelgetcolor($x, 300)
  4.         mousemove($x, 300, 0)
  5. next
  6. msgbox(0, 0, timerdiff($htimer))
复制代码
发表于 2023-9-21 23:27:21 | 显示全部楼层
可以截屏后对图片上的坐标取色。这样就不存在数秒的延迟了。
 楼主| 发表于 2023-9-22 06:46:38 | 显示全部楼层

可以截屏后对图片上的坐标取色。这样就不存在数秒的延迟了。

这样就不方便了,界面在不断变化,我设计的程序是每分每秒在不断检测颜色的!
发表于 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年前我也问过,后面应该是换方案了:
 楼主| 发表于 2023-9-22 20:25:44 | 显示全部楼层

; 预先定义一个固定大小的数组用于存储像素颜色
local $pixelcolors[201]

一样,还是慢!
 楼主| 发表于 2023-9-22 20:26:42 | 显示全部楼层

现在还有这个问题吗?
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 | 显示全部楼层

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无关,任何语言都有这个问题。他们的爱体育的解决方案是,把整个区域放入内存,以位图的形式检测颜色。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

||小黑屋|爱体育 ( ) "));

gmt 8, 2023-12-7 01:01 , processed in 0.095990 second(s), 20 queries .

powered by x3.5

© 2001-2023 .

返回列表
网站地图