# 需要安装pywin32,numpy,cv2模块import time
import win32api
import win32con
import win32gui
import win32ui
import numpy
import cv2class Util(object):def __init__(self, hwnd) -> None:self.hwnd = hwnddef capture_screen(self):try:left, top, right, bot = win32gui.GetWindowRect(self.hwnd)width = right - leftheight = bot - top# 返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框while self.hwnd == 0:print('hwnd==0')returnhWndDC = win32gui.GetWindowDC(self.hwnd)# 创建设备描述表mfcDC = win32ui.CreateDCFromHandle(hWndDC)# 创建内存设备描述表saveDC = mfcDC.CreateCompatibleDC()# 创建位图对象准备保存图片saveBitMap = win32ui.CreateBitmap()# 为bitmap开辟存储空间saveBitMap.CreateCompatibleBitmap(mfcDC, width, height)# 将截图保存到saveBitMap中saveDC.SelectObject(saveBitMap)# 保存bitmap到内存设备描述表saveDC.BitBlt((0, 0), (width, height), mfcDC, (0, 0), win32con.SRCCOPY)# 方法三(第一部分):opencv+numpy保存# 获取位图信息signedIntsArray = saveBitMap.GetBitmapBits(True)# 方法三(第二部分):opencv+numpy保存# PrintWindow成功,保存到文件,显示到屏幕im_opencv = numpy.frombuffer(signedIntsArray, dtype='uint8')im_opencv.shape = (height, width, 4)cv2.cvtColor(im_opencv, cv2.COLOR_BGRA2RGB)cv2.imencode(".bmp", im_opencv)[1].tofile('截图'+str(self.hwnd)+'.bmp')# 内存释放win32gui.DeleteObject(saveBitMap.GetHandle())saveDC.DeleteDC()mfcDC.DeleteDC()win32gui.ReleaseDC(self.hwnd, hWndDC)# cv2.namedWindow('im_opencv') #命名窗口# cv2.imshow("im_opencv",im_opencv) #显示# cv2.waitKey(0)# cv2.destroyAllWindows()# 方法一# saveBitMap.SaveBitmapFile(saveDC,"img_Winapi.bmp")returnexcept :print('异常')def get_hwnd(title):hwnd = win32gui.FindWindow(0, title)return hwnddef get_son_hwnd(parent):if not parent:returnson_hwnd = []win32gui.EnumChildWindows(parent, lambda hwnd, param: param.append(hwnd), son_hwnd)print('son_hwnd:', son_hwnd)return son_hwnd[0]def get_window_hwnd():return win32gui.GetDesktopWindow()def click(self, x, y):posi = win32api.MAKELONG(int(x), int(y))win32api.SendMessage(self.hwnd, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON, posi)win32api.SendMessage(self.hwnd, win32con.WM_LBUTTONUP,win32con.MK_LBUTTON, posi)def swipe(self, template, similarity, numb1: int, numb2: int):while True:time.sleep(3)self.capture_screen()tmp = self.match_template(template, similarity)if max(numb2, numb1) > len(tmp[1]):continueelse:posi = win32api.MAKELONG(int(tmp[1][numb1][0]), int(tmp[1][numb1][1]))posi2 = win32api.MAKELONG(int(tmp[1][numb2][0]), int(tmp[1][numb2][1]))win32api.SendMessage(self.hwnd, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON, posi)win32api.SendMessage(self.hwnd, win32con.WM_MOUSEMOVE, 0, 0)win32api.SendMessage(self.hwnd, win32con.WM_LBUTTONUP,win32con.MK_LBUTTON, posi2)time.sleep(5)self.capture_screen()returndef find_and_click(self, template, similarity):while True:if self.find_image(template, similarity)[0] is True:posi = self.find_image(template, similarity)self.click(posi[1][0], posi[1][1])time.sleep(3)self.capture_screen()if self.find_image(template, similarity)[0] is True:self.find_and_click(template, similarity)return posielse:return positime.sleep(10)self.capture_screen()def find_click_once(self, template, similarity):while True:if self.find_image(template, similarity)[0] is True:posi = self.find_image(template, similarity)self.click(posi[1][0], posi[1][1])return posiself.capture_screen()def find_two_click(self, template1, template2, similarity):while True:self.capture_screen()t = self.find_image(template1, similarity)if t[0] is True:tmp = self.match_template(template2, similarity)min = 1000x = 0y = 0for i in tmp[1]:if abs(i[1]-t[1][1]) < min:min = abs(i[1]-t[1][1])x = i[0]y = i[1]self.click(x, y)print(x, y)return (x, y)def find_all_and_click(self, template, similarity, numb):while True:tmp = self.match_template(template, similarity)if tmp[0] is True:if len(tmp[1]) > numb:self.click(tmp[1][numb][0], tmp[1][numb][1])print(tmp)return tmpself.capture_screen()# TM_CCOEFF相关系数匹配# TM_CCOEFF_NORMED归一化相关系数匹配# TM_CCORR相关匹配.模板图像相乘,数值大最佳匹配,数值小最差匹配# TM_CCORR_NORMED归一化相关匹配# TM_SQDIFF平方差匹配.最佳匹配=0# TM_SQDIFF_NORMED标准平方差匹配def find_image(self, template: str, similarity: float):try:scr = cv2.imdecode(numpy.fromfile('截图'+str(self.hwnd)+'.bmp', dtype=numpy.uint8), 0)tp = cv2.imdecode(numpy.fromfile(template, dtype=numpy.uint8), 0)result = cv2.matchTemplate(scr, tp, cv2.TM_CCOEFF_NORMED)except cv2.error:print('file error')return False, Noneh, w = tp.shape[:2]min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)if max_val < similarity:return False, Noneelse:posi = (max_loc[0]+w//2, max_loc[1]+h//2,max_loc[0], max_loc[1]-h, max_loc[0]+w, max_loc[1]-h)return True, posidef match_template(self, template: str, similarity: float):try:scr = cv2.imdecode(numpy.fromfile('截图'+str(self.hwnd)+'.bmp', dtype=numpy.uint8), 0)tp = cv2.imdecode(numpy.fromfile(template, dtype=numpy.uint8), 0)except cv2.error:print('file err')posi = []h, w = tp.shape[:2]match = cv2.matchTemplate(scr, tp, cv2.TM_CCOEFF_NORMED)indices = (-match).argpartition(100, axis=None)[:100]unreveled_indices = numpy.array(numpy.unravel_index(indices, match.shape)).Tfor location in unreveled_indices:y, x = locationconfidence = match[y][x]if confidence >= similarity:posi.append((x+w//2, y+h//2))tmp = []  # 接收posi坐标for i in range(len(posi)-1):for j in range(i+1, len(posi)):if abs(posi[i][0]-posi[j][0]) <= 3 and abs(posi[i][1]-posi[j][1]) <= 3:tmp.append(j)for i in reversed(list(set(tmp))):posi.pop(i)posi.sort(key=lambda x: x[1])return True, posi
  1. 获取窗口句柄

可以使用按键精灵的按键抓抓

python基于win32实现梦幻西游手游后台鼠标键盘相关推荐

  1. python写梦幻西游手游脚本_PyCharm2020.1 全新版本助力你的编程路

    人生苦短,我用python,可以说是Python程序员的口头禅了,而Pycharm便是Python编程最广泛使用的编程软件之一:因为其干净利落的界面,超方便的功能特性,许多老师在相关编程课上,也都会使 ...

  2. python 梦幻西游手游脚本_梦幻西游手游抢怪有什么技巧 梦幻西游抢怪技巧

    今天小编为大家带来了梦幻西游手游抢怪有什么技巧 梦幻西游抢怪技巧,感兴趣的朋友们可以跟着小编去下文了解一下哦! 游戏中的资源就在那里不多不少,你抢或不抢都随你,但是你能得多少就不能随你啦!在游戏中抢怪 ...

  3. 梦幻西游手游排队显示服务器已满,梦幻西游手游排队进不去 一直排队解决方法...

    今天小编为大家带来了梦幻西游手游排队进不去 一直排队解决方法,感兴趣的朋友们可以跟着小编去下文了解一下哦! 梦幻西游手游排队进不去,一直排队怎么办?游戏新开服,总是会有一堆服务器排队问题,那么梦幻西游 ...

  4. 梦幻西游手游炼药信息采集系统(Node.js+Express+Bower+Bootstrap+Mongodb+Mongoose)

    梦幻西游手游炼药信息采集系统 一.初衷 本文不是软文!!!本文不是软文!!!本文不是软文!!!文章开始重要的事情说三遍!!! 初中时玩一款网易的游戏叫<梦幻西游>,前两天看朋友在玩< ...

  5. 梦幻西游一直显示网络连接到服务器失败,梦幻西游手游网络连接异常怎么办 网络连接错误超时解决办法...

    梦幻西游手游这款游戏最近火爆极了,很多小伙伴都在玩这款游戏,那么游戏中出现连接错误异常怎么办呢?该怎么解决呢?下面就请看小编为大家带来的攻略吧! 梦幻西游手游4G网络无法登陆解决方法 最近有小伙伴反映 ...

  6. 梦幻西游手游一直连不上服务器,梦幻西游手游进不去怎么办 登陆失败解决方法...

    梦幻西游手游首测当前火爆异常,大家都想体验一下当年玩梦幻西游pc客户端时候的感觉.如果遇到梦幻西游手游进不去就尴尬了,万一真进不去怎么办呢?不要急,下面小编给大家带来梦幻西游手游进不去的解决方法. 梦 ...

  7. 梦幻西游手游服务器维护时段,梦幻西游手游2018合区时间服务器汇总详解

    梦幻西游手游什么时候合区,合区服务器有哪些呢?下面就给大家分享一下今年的所有服务器合区的内容汇总,有兴趣的朋友们一起来看看吧. 梦幻西游手游2018年什么时候合区? 最新合区:暂未开始 2018年3月 ...

  8. 梦幻手游最新服务器,梦幻西游手游12月18日新服务器开服公告

    <梦幻西游>手游由网易梦幻西游团队倾力打造,游戏上线以来收获超过3000万注册用户,最高同时在线人数达到204万,累计登陆iOS畅销榜榜首超过200天,是2015年唯一包揽App Stor ...

  9. 梦幻西游手游服务器维护公告,梦幻西游手游3月7日全区全服维护更新公告

    为保证服务器的运行稳定和服务质量,梦幻西游手游将于3月7日8:00停机,进行维护工作.预计维护时间为8:00-9:00.如果在预定时间内无法完成维护内容,开机时间也将继续顺延. 请各位玩家相互转告,并 ...

最新文章

  1. 网络设置计算机,怎么重置电脑网络设置
  2. SAP EWM - 其他主数据 - 供应链单元
  3. 【git学习】git管理本地项目
  4. [flutter专题]详解AppBar小部件
  5. .NET Core开发实战(第4课:Startup:掌握ASP.NET Core的启动过程)--学习笔记
  6. ​怎么用藏头诗向女友表白......
  7. php登陆框_PHP 登录完成跳转上一访问页面
  8. 使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等)
  9. 十四、PHP框架Laravel学习笔记——构造器的排序分组、子查询
  10. android其架构图,Android系统架构图,带你直观了解Android基本架构
  11. 毕业论文详细--校园网组建
  12. 开源在线视频播放器flowplayer
  13. 芯片架构--四大处理器架构
  14. css inset属性
  15. 强化学习之Grid World的时序差分算法解析【MiniWorld】SYSU_2023SpringRL
  16. 微信官方多端框架Donut可将小程序编译成 Android 以及 iOS 应用了
  17. 拼购造富,苏宁引领“电商扶贫”
  18. 书签 自动更新浏览器的书签_最有用的书签,可增强您的浏览体验
  19. 程序员:用代码改变世界
  20. 2018新年管理感言

热门文章

  1. 铁匠smith_铁匠的制作:概念和艺术创作
  2. pes2020服务器维护中,【重磅】PES2021删卡时刻/传奇及国际服补偿一览
  3. 2017-2018-1(实变函数56, 点集拓扑56)
  4. Jfrog:烂泥蛙安装
  5. java项目报错405_405报错是什么原因_状态码405是什么错误
  6. 一名开源工程师的自白
  7. 剑灵狂欢区服务器位置,9377剑灵洪门崛起6月25日部分区合服公告
  8. Halcon缺陷检测——光度立体
  9. 【C语言】循环语句(do while循环)
  10. 贝叶斯统计学习笔记|Bayesian Statistics|Metropolis-Hastings与Gibbs Sampling