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

这篇具有很好参考价值的文章主要介绍了python基于win32实现梦幻西游手游后台鼠标键盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

# 需要安装pywin32,numpy,cv2模块

import time
import win32api
import win32con
import win32gui
import win32ui
import numpy
import cv2


class Util(object):
    def __init__(self, hwnd) -> None:
        self.hwnd = hwnd

    def capture_screen(self):
        try:
            left, top, right, bot = win32gui.GetWindowRect(self.hwnd)
            width = right - left
            height = bot - top
            # 返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框
            while self.hwnd == 0:
                print('hwnd==0')
                return
            hWndDC = 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")
            return
        except :
            print('异常')
    def get_hwnd(title):
        hwnd = win32gui.FindWindow(0, title)
        return hwnd

    def get_son_hwnd(parent):
        if not parent:
            return
        son_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]):
                continue
            else:
                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()
                return

    def 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 posi
                else:
                    return posi
            time.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 posi
            self.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 = 1000
                x = 0
                y = 0
                for 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 tmp
            self.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, None
        h, w = tp.shape[:2]
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

        if max_val < similarity:
            return False, None
        else:
            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, posi

    def 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)).T
        for location in unreveled_indices:
            y, x = location
            confidence = 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. 获取窗口句柄

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

        文章来源地址https://www.toymoban.com/news/detail-515168.html

到了这里,关于python基于win32实现梦幻西游手游后台鼠标键盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python实现对图油画、卡通、梦幻、草图、水彩效果

    本篇博客将介绍如何使用wxPython模块和OpenCV库来实现对图像进行灰度化、二值化、伽马校正、色彩空间转换和图像反转这5种效果的合并程序。程序可以通过wxPython提供的GUI界面来选择图片路径和效果类型,程序会将处理后的图像保存到指定路径并打开。 步骤一:安装wxPython和

    2024年02月13日
    浏览(32)
  • python使用win32com库实现对Excel的操作

    在日常工作中,我们经常需要对Excel文件进行操作,例如读取和写入数据、格式化和样式、插入和删除等。而使用Python的win32com库,我们可以通过代码来实现对Excel的自动化操作,提高工作效率和准确性。 本篇博客将介绍如何使用win32com库来操作Excel,包括安装和配置、创建和

    2024年02月14日
    浏览(32)
  • 使用Python的win32com库实现对PowerPoint的操作

    PowerPoint是微软公司开发的一款流行的演示文稿软件,广泛应用于演讲、培训和商务展示等场景。win32com库是Python的一个扩展模块,可以用于操作Windows系统中的COM组件,包括PowerPoint应用程序。本篇博客将介绍如何使用Python的win32com库来实现对PowerPoint的操作。 在开始之前,我们

    2024年02月05日
    浏览(58)
  • 使用Python的win32com库实现对Word的操作

    win32com库是Python中的一个扩展库,它提供了与Microsoft Office应用程序进行交互的功能。在本篇博客中,我们将重点介绍如何使用win32com库来操作Word文档。使用win32com库可以方便地打开、创建、保存和编辑Word文档,以及进行格式化和布局等操作。 要使用win32com库,首先需要安装它

    2024年02月06日
    浏览(35)
  • Python 使用 win32gui+win32api 通过鼠标获取句柄

    通过python实现某些win相关的自动化操作时,可能需要通过句柄操作. 获取的方法有很多.对此也有相关的可视化的软件实现类似的功能.比如: 通过vs工具获取窗体或者程序句柄 使用按键精灵获取句柄 使用某星小助手等 为此分享的当前的文章介绍的方法也是一种可视化的获取句柄

    2024年02月14日
    浏览(38)
  • 基于DirectX11+ImGui的Win32桌面程序开发

    举两个常用的开发框架,MFC和Qt Widget里面每个控件都是Window,这是和DirectUI最大的区别。下面简单梳理下这个DirectUI与GUI之前错综复杂的爱恨情仇: ① 在侏罗纪时期,传统的Handle式GUI框架,是由操作系统内核(win32k.sys)直接提供的接口(GDI),采用消息驱动的机制。窗口在Windows 操作系

    2024年02月12日
    浏览(37)
  • C# 实现打印机队列监控Win32_PrintJob,Win32_Printer

    实现一个检测系统发出的打印队列文件,打印的状态,打印机状态的模块。 先上效果图 要用到Win32_PrintJob,Win32_Printer。 其中,Win32_Printer是打印机的各种状态和控制。 Win32_Printer 类 - Win32 apps | Microsoft Learn Win32_PrintJob是打印队列的各种数据和状态。Win32_PrintJob 类 - Win32 apps |

    2024年02月04日
    浏览(80)
  • 解决 Python 中的 ‘No module named ‘win32gui‘‘ 和 ‘No module named ‘win32console‘‘ 错误

    解决 Python 中的 ‘No module named ‘win32gui’’ 和 ‘No module named ‘win32console’’ 错误 当你在使用 Python 编写程序时,有时可能会遇到类似于 ‘No module named ‘win32gui’’ 和 ‘No module named ‘win32console’’ 的错误消息。这些错误通常发生在你尝试在 Windows 系统上使用与图形用户界

    2024年02月04日
    浏览(39)
  • [Python进阶] Python操作word:win32com、python-docx

    7.5.1 通过win32com操作 7.5.1.1 新建word并写入内容 7.5.1.2 读取word 离离原上草,岁晚霜霰滋。 与子为兄弟,生世逢乱离。 漂荡各分散,生死安得知。 乐土叹无食,南州叹无衣。 良时幸休明,天路开清夷。 翩翩两鸿鹄,振翼思奋飞。 一留故山树,一望云中涯。 东西各异势,顾影

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包