【python】分享一个在Windows下对应用程序python窗口后台截图的方法
最近心血来潮想自己用python写一个图色操作游戏的脚本,于是上百度一查“python后台截图”,事实上能用的也就是pywin32读取内存截图(什么设备环境、设备描述表、内存设备描述表的),而且翻来翻去就是这一套代码。
类似这个:
#获取后台窗口的句柄,注意后台窗口不能最小化
hWnd = win32gui.FindWindow("NotePad",None) #窗口的类名可以用Visual Studio的SPY++工具获取
#获取句柄窗口的大小信息
left, top, right, bot = win32gui.GetWindowRect(hWnd)
width = right - left
height = bot - top
#返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框
hWndDC = win32gui.GetWindowDC(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)
但这个代码似乎只是针对MFC应用(不知到有多过时了),在win10下对某些游戏截图总是不完整,还被被各路神仙转来转去,乍一看博文 发布时间2021年,其实早就是20年前的代码(就连后面的print都python是不带括号的,2.x的代码)。
思来想去,PyQt不是自带一个screen模块,可以对句柄窗口就行截图吗,不知道内部实现的原理是啥,不妨试试看了:
# -*- coding: utf-8 -*-from PyQt5.QtWidgets import QApplication
import win32gui
from numpy import array,uint8,ndarray# 直接写一个类,方便以后使用
class Screen:def __init__(self,win_title=None,win_class=None,hwnd=None) -> None:self.app = QApplication(['WindowCapture'])self.screen = QApplication.primaryScreen()self.bind(win_title,win_class,hwnd)def bind(self, win_title=None,win_class=None,hwnd=None):'可以直接传入句柄,否则就根据class和title来查找,并把句柄做为实例属性 self._hwnd'if not hwnd: self._hwnd = win32gui.FindWindow(win_class, win_title)else: self._hwnd = hwnddef capture(self, savename='') -> ndarray:'截图方法,在窗口为 1920 x 1080 大小下,最快速度25ms (grabWindow: 17ms, to_cvimg: 8ms)'def to_cvimg(pix):'将self.screen.grabWindow 返回的 Pixmap 转换为 ndarray,方便opencv使用'qimg = pix.toImage()temp_shape = (qimg.height(), qimg.bytesPerLine() * 8 // qimg.depth())temp_shape += (4,)ptr = qimg.bits()ptr.setsize(qimg.byteCount())result = array(ptr, dtype=uint8).reshape(temp_shape)return result[..., :3]self.pix = self.screen.grabWindow(self._hwnd)self.img = to_cvimg(self.pix)if savename: self.pix.save(savename)return self.imgif __name__ =='__main__':screen = Screen(win_title='')screen.capture('test.bmp')
一顿操作+实验,总结如下:
1.在对某些大型应用截图时,PyQt更完整,至少不会出现漏缺的情况,虽然在windows的不同缩放比例下会出现大的黑边,但都是分布在右、下,对实际使用影响不大。
2.缺点也很明显:当窗口被拖动到屏幕可视区域之外时,无法捕捉。
这时候有的同学就急了,啥?那不是跟前台截图一样事儿的吗?那我还用个屁的PyQt,用XXX一行代码搞定了。
事实上只要这个窗口不被拖动到屏幕之外或者最小化,你想堆叠多少个都没问题(即使被其他应用遮挡),你自己看着办咯。
【python】分享一个在Windows下对应用程序python窗口后台截图的方法相关推荐
- python打开一个文件夹下所有txt文件-python读取一个目录下所有txt里面的内容方法...
实例如下所示: import os allFileNum = 0 def printPath(level, path): global allFileNum ''''' 打印一个目录下的所有文件夹和文 ...
- 怎么看c语言程序目录,windows下c语言获取程序当前的执行目录,读文件的代码片...
代码如下: #include "stdafx.h" #include "stdlib.h" #include #include int _tmain(int a ...
- Python图片文字识别——Windows下Tesseract-OCR的安装与使用
Python图片文字识别--Windows下Tesseract-OCR的安装与使用 前言 Windows下Tesseract-OCR的安装与配置 Tesseract-OCR简介与版本选择 tesser ...
- python写一个网络测速脚本_利用Python实现网络测试的脚本分享
前言 最近同学让我帮忙写一个测试网络的工具.由于工作上的事情,断断续续地拖了很久才给出一个相对完整的版本.其实,我Python用的比较少,所以基本都是边查资料边写程序. 程序的主要逻辑如下: 读取一个 ...
- python playsound安装_ python音频库:Windows下pydub安装配置、过程出现的问题及常用API ...
< python音频库:Windows下pydub安装配置.过程出现的问题及常用API > 背景 刚从B站上看过倒放挑战之后也想体验下,心血来潮一个晚上完成了基本的实现.其中倒放与播放部分 ...
- Python+Django+Eclipse 在Windows下快速开发自己的网站
Python+Django+Eclipse 在Windows下快速开发自己的网站 一.配置开发环境 我的开发环境是:Python3.3.2 + Django1.5.2 + Eclipse 1.安装Py ...
- python自动填写小程序表单_新年好!教大家用Python写一个自动回复拜年信息的小程序!...
原标题:新年好!教大家用Python写一个自动回复拜年信息的小程序! 过年期间,想必大家都收到很多拜年信息吧!有没有也被拜年短信(大部分是群发)搞得很焦虑?不回复似乎显得很没有礼貌,一一回复又累心劳神 ...
- 分享一个GSM短信猫接口程序
分享一个GSM短信猫接口程序 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/details/8586348 作者:张 ...
- c语言windows获取时间,【转载】c/c++在windows下获取时间和计算时间差的几种方法总结...
一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...
最新文章
- Android Market 链接的生成与分享
- 怎么判断网络回路_PLC控制回路故障的判断和检修方法与技巧!
- Android开发--FileInputStream/OutStream/Sdcard写入
- Oracle 要慌了!华为终于开源了自家的 Huawei JDK——毕昇 JDK!
- 科大星云诗社动态20220113
- 8086CPU汇编:一般的标号与直接定址标号
- 只提取单元格中的数字_提取Excel单元格中的数字(4类)及原理
- 肝了一个月,我做了个免费的面试刷题网
- 这些面试中经常被问到的线程池问题,你都能回答的上来吗?
- recurdyn和matlab联合仿真,基于RecurDyn与Simulink的液压破碎锤联合仿真与试验分析
- Python-while 计算100以内奇数和
- 英语国际音标发音——见标能读
- 计算机基础ps变换蝴蝶,在PS中用自由变换制作飞舞的蝴蝶和用内容识别比例缩放的操作过程...
- ai人工智能让女神_人工智能可能只会让你兴奋不已
- MAC常用进入文件夹剪贴粘贴打开文件夹快捷键
- 支持小米java文件阅读器_小米开源文件管理器MiCodeFileExplorer-源码研究(0)-初步研究...
- Markdown标记语法Typora编辑器零基础入门新手学习使用总结教程
- 计算机缩写术语完全介绍 By 001pc @ 1997.10.1-2004-6-12
- Linux (centos7)安装字体
- 基于51单片机---遥控灯