这是我的第一篇博客,记录的是之前匹配微信小程序按键的图像,代码的内容很多都是在各种地方攒的,反正最后的功能还是实现了的。
识别窗口
首先你得确定你要辨别的窗口
import win32con
import win32ui
import win32gui
import win32api
hwnd = win32gui.FindWindow(None, "xxx") # 父句柄,不懂的可以直接去网上搜索这行代码,会有详细的讲解
hwndChildList = [] # 创建子窗口列表
win32gui.EnumChildWindows(hwnd, lambda hwnd, param: param.append(hwnd), hwndChildList)
hwnd1 = win32gui.FindWindowEx(hwndChildList[0], 0, None, None)
# win32gui.SetForegroundWindow(hwnd) # 指定句柄设置为前台,也就是激活
# win32gui.ShowWindow(hwnd, win32con.SW_NORMAL) # 显示最前 从最小化模式显示为正常
windowRec = win32gui.GetWindowRect(hwnd1) # 目标子句柄窗口的坐标 左上右下边到屏幕边的距离
# 获得窗口的坐标、宽高
left, top, right, bottom = windowRec[0], windowRec[1], windowRec[2], windowRec[3]
width, height = windowRec[2] - windowRec[0], windowRec[3] - windowRec[1]
窗口截图
获取到窗口句柄后就可以进行截图了,截图的目的是为了后面的图形匹配,我本来一直用的桌面截图,效率太低,后来发现可以窗口截图,速度提升了十倍!
def capture(file_name, capture_width, capture_height):
# 返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框
hWndDC = win32gui.GetWindowDC(hwnd1)
# 创建设备描述表
mfcDC = win32ui.CreateDCFromHandle(hWndDC)
# 创建内存设备描述表
saveDC = mfcDC.CreateCompatibleDC()
# 创建位图对象准备保存图片
saveBitMap = win32ui.CreateBitmap()
# 为bitmap开辟存储空间
saveBitMap.CreateCompatibleBitmap(mfcDC, capture_width, capture_height)
# 将截图保存到saveBitMap中
saveDC.SelectObject(saveBitMap)
# 保存bitmap到内存设备描述表
saveDC.BitBlt((0, 0), (capture_width, capture_height), mfcDC, (0, 0), win32con.SRCCOPY)
saveBitMap.SaveBitmapFile(saveDC, file_name)
# 内存释放
saveDC.DeleteDC()
win32gui.DeleteObject(saveBitMap.GetHandle())
mfcDC.DeleteDC()
win32gui.ReleaseDC(hwnd, hWndDC)
# capture("images/animal_screenshot.png", width, height)
这个代码是找的网上的,我也不懂原理好用就行,是我在所有代码里找的最好用而且最快的
最后一行是代码解释
第一个传入的参数是保存的文件路径,我写的是存入一个images的文件夹并保存成animal_screenshot的图片
第二个是窗口的宽,第三个就是窗口的高
匹配图形
实现图形匹配
def check_pic(img_name, a, click=False):
# 屏幕缩放系数 mac缩放是2 windows一般是1
screenScale = 1
# 事先读取按钮截图
img_path = 'images/{img}.png'.format(img=str(img_name))
target = cv2.imread(