发表回复 
等图像改变() — 确保操作已被响应
2019-05-04, 03 : 15 (这个帖子最后修改于: 2019-05-04 03 : 30 by feiyue.)
Rainbow 等图像改变() — 确保操作已被响应
自动化操作时,我们进行了一步操作,往往要确认程序响应了操作,
一般可以用:等待窗口出现、等待窗口消失、等待颜色出现、等待颜色消失,等等。

现在可以使用这个傻瓜化的 “等图像改变()” 函数,只要操作后判断屏幕
某一处的静态图像发生了改变,就可以确认程序响应了操作,十分方便。

代码: (全选)
;-- 按 【F2】热键测试:等鼠标下的屏幕图像改变,5秒超时

F2::
CoordMode, Mouse, Screen
MouseGetPos, x, y
等图像改变(x-50, y-50, x+50, y+50)  ;获取屏幕图像的初始哈希值
;---------------------------------
ok:=等图像改变(x-50, y-50, x+50, y+50, 5)
MsgBox, 4096,, % "等图像改变:" (ok ? "成功":"失败")
return


;---------------------------
;  等图像改变() -- By FeiYue
;---------------------------
;  参数说明:
;  x1,y1 为矩形范围左上角屏幕坐标
;  x2,y2 为矩形范围右下角屏幕坐标
;  t 为等待秒数,设为0则不等待只检查一次就返回,小于0则无限等待
;  返回值:等待时间内指定范围的图像改变就返回1,否则0
;---------------------------
;  使用说明:
;  这个函数是配对使用的,必须先用不带 t 参数的相同范围的
;  调用一次,获取屏幕图像的初始哈希值,才能后续等待改变
;  例如:等图像改变(x1,y1,x2,y2)…点击…等图像改变(x1,y1,x2,y2,3)
;---------------------------
等图像改变(x1, y1, x2, y2, t="GetHash")
{
  static hash
  x:=x1<x2 ? x1 : x2, y:=y1<y2 ? y1 : y2
  w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1
  xywh2xywh(x,y,w,h, x,y,w,h)
  if (w<1 or h<1)
    return, 0
  if (t="GetHash")
  {
    hash:=GetHashFromScreen(x,y,w,h)
    return
  }
  endt:=A_TickCount+Round(t*1000)
  Loop {
    Sleep, 100
    if GetHashFromScreen(x,y,w,h)!=hash
      return, 1
    if (t>=0) and (A_TickCount>=endt)
      return, 0
  }
}

;---------------------------
;  GetHashFromScreen() -- By FeiYue
;---------------------------
;  参数说明:x,y 为矩形范围左上角屏幕坐标
;  w,h 为矩形范围的宽度和高度
;  返回值:返回屏幕指定范围的图像哈希值
;---------------------------
GetHashFromScreen(x, y, w, h)
{
  static Ptr:=A_PtrSize ? "UPtr" : "UInt", PtrP:=Ptr "*"
  ListLines, % "Off" (lls:=A_ListLines=0 ? "Off":"On")/0
  bch:=A_BatchLines
  SetBatchLines, -1
  hash:=0, bpp:=32, Stride:=((w*bpp+31)//32)*4
  win:=DllCall("GetDesktopWindow", Ptr)
  hDC:=DllCall("GetWindowDC", Ptr,win, Ptr)
  mDC:=DllCall("CreateCompatibleDC", Ptr,hDC, Ptr)
  ;--------------------
  VarSetCapacity(bi, 40, 0), NumPut(40, bi, 0, "int")
  NumPut(w, bi, 4, "int"), NumPut(h, bi, 8, "int")
  NumPut(1, bi, 12, "short"), NumPut(bpp, bi, 14, "short")
  ;--------------------
  if hBM:=DllCall("CreateDIBSection", Ptr,mDC, Ptr,&bi
    , "int",0, PtrP,ppvBits, Ptr,0, "int",0, Ptr)
  {
    oBM:=DllCall("SelectObject", Ptr,mDC, Ptr,hBM, Ptr)
    DllCall("BitBlt", Ptr,mDC, "int",0, "int",0, "int",w, "int",h
      , Ptr,hDC, "int",x, "int",y, "uint",0x00CC0020|0x40000000)
    hash:=DllCall("ntdll\RtlComputeCrc32", "uint",0
      , Ptr,ppvBits, "uint",Stride*h, "uint")
    DllCall("SelectObject", Ptr,mDC, Ptr,oBM)
    DllCall("DeleteObject", Ptr,hBM)
  }
  DllCall("DeleteDC", Ptr,mDC)
  DllCall("ReleaseDC", Ptr,win, Ptr,hDC)
  SetBatchLines, %bch%
  ListLines, %lls%
  return, hash
}

xywh2xywh(x1,y1,w1,h1,ByRef x,ByRef y,ByRef w,ByRef h)
{
  SysGet, zx, 76
  SysGet, zy, 77
  SysGet, zw, 78
  SysGet, zh, 79
  left:=x1, right:=x1+w1-1, up:=y1, down:=y1+h1-1
  left:=left<zx ? zx:left, right:=right>zx+zw-1 ? zx+zw-1:right
  up:=up<zy ? zy:up, down:=down>zy+zh-1 ? zy+zh-1:down
  x:=left, y:=up, w:=right-left+1, h:=down-up+1
}
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 1用户表示感谢feiyue
发表回复 


论坛跳转:


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合