python基于win32实现梦幻西游手游后台鼠标键盘
生活随笔
收集整理的這篇文章主要介紹了
python基于win32实现梦幻西游手游后台鼠标键盘
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
# 需要安裝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# 返回句柄窗口的設(shè)備環(huán)境,覆蓋整個窗口,包括非客戶區(qū),標題欄,菜單,邊框while self.hwnd == 0:print('hwnd==0')returnhWndDC = win32gui.GetWindowDC(self.hwnd)# 創(chuàng)建設(shè)備描述表mfcDC = win32ui.CreateDCFromHandle(hWndDC)# 創(chuàng)建內(nèi)存設(shè)備描述表saveDC = mfcDC.CreateCompatibleDC()# 創(chuàng)建位圖對象準備保存圖片saveBitMap = win32ui.CreateBitmap()# 為bitmap開辟存儲空間saveBitMap.CreateCompatibleBitmap(mfcDC, width, height)# 將截圖保存到saveBitMap中saveDC.SelectObject(saveBitMap)# 保存bitmap到內(nèi)存設(shè)備描述表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')# 內(nèi)存釋放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相關(guān)系數(shù)匹配# TM_CCOEFF_NORMED歸一化相關(guān)系數(shù)匹配# TM_CCORR相關(guān)匹配.模板圖像相乘,數(shù)值大最佳匹配,數(shù)值小最差匹配# TM_CCORR_NORMED歸一化相關(guān)匹配# 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
獲取窗口句柄
? ? ? ? 可以使用按鍵精靈的按鍵抓抓
????????
總結(jié)
以上是生活随笔為你收集整理的python基于win32实现梦幻西游手游后台鼠标键盘的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 江南科友 hac linux shell
- 下一篇: pac相关项目记录