最近心血来潮想自己用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窗口后台截图的方法相关推荐

  1. python打开一个文件夹下所有txt文件-python读取一个目录下所有txt里面的内容方法...

    实例如下所示: import os allFileNum = 0 def printPath(level, path): global allFileNum ''''' 打印一个目录下的所有文件夹和文 ...

  2. 怎么看c语言程序目录,windows下c语言获取程序当前的执行目录,读文件的代码片...

    代码如下: #include "stdafx.h" #include "stdlib.h" #include #include int _tmain(int a ...

  3. Python图片文字识别——Windows下Tesseract-OCR的安装与使用

    Python图片文字识别--Windows下Tesseract-OCR的安装与使用 前言 Windows下Tesseract-OCR的安装与配置 Tesseract-OCR简介与版本选择 tesser ...

  4. python写一个网络测速脚本_利用Python实现网络测试的脚本分享

    前言 最近同学让我帮忙写一个测试网络的工具.由于工作上的事情,断断续续地拖了很久才给出一个相对完整的版本.其实,我Python用的比较少,所以基本都是边查资料边写程序. 程序的主要逻辑如下: 读取一个 ...

  5. python playsound安装_ python音频库:Windows下pydub安装配置、过程出现的问题及常用API ...

    < python音频库:Windows下pydub安装配置.过程出现的问题及常用API > 背景 刚从B站上看过倒放挑战之后也想体验下,心血来潮一个晚上完成了基本的实现.其中倒放与播放部分 ...

  6. Python+Django+Eclipse 在Windows下快速开发自己的网站

    Python+Django+Eclipse 在Windows下快速开发自己的网站 一.配置开发环境 我的开发环境是:Python3.3.2 + Django1.5.2 + Eclipse 1.安装Py ...

  7. python自动填写小程序表单_新年好!教大家用Python写一个自动回复拜年信息的小程序!...

    原标题:新年好!教大家用Python写一个自动回复拜年信息的小程序! 过年期间,想必大家都收到很多拜年信息吧!有没有也被拜年短信(大部分是群发)搞得很焦虑?不回复似乎显得很没有礼貌,一一回复又累心劳神 ...

  8. 分享一个GSM短信猫接口程序

    分享一个GSM短信猫接口程序 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/details/8586348 作者:张 ...

  9. c语言windows获取时间,【转载】c/c++在windows下获取时间和计算时间差的几种方法总结...

    一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...

最新文章

  1. ubuntu安装snort
  2. 从菜鸟到老鸟--Mac篇 [五]
  3. java 小时转换为xx天xx小时
  4. for循环和while循环
  5. 最新中国一二三四五线城市排名出炉!去这些城市买房准没错!
  6. 4k纸是几厘米乘几厘米_4k纸多大(4k纸有几张a4纸大)
  7. 软件测试中的Bug基础知识总结
  8. Power BI(十二)Power Pivot时间智能函数
  9. 挂yy协议的服务器,yy协议挂机工具免费版
  10. genymotion-安卓模拟器-修改IMEI
  11. 微信营销吸粉秘籍之:360谈谈
  12. 五款高效率黑科技神器工具,炸裂好用,省时间
  13. 华为Mate40系列国行参数价格曝光
  14. x:Name与x:Key
  15. css背景上能添加文字,如何利用div+css来给背景图片上文字布局
  16. 二次型如何快速转化为矩阵?
  17. 微信小程序云开发操作全解
  18. linux内核时钟工作原理,需要学习并了解Linux时钟的原理及其应用
  19. 计算机科学与技术一级学科硕士点,计算机科学与技术一级学科(硕士)、软件工程一级学科(硕士)和计算机技术、软件工程专业硕士学位授权点通过专家评审...
  20. a股历史30年的大盘价_中国股市历史图(中国股市30年走势图)

热门文章

  1. 移动通信中m序列的Matlab仿真
  2. Foxit PDF SDK 7.6 for C++/C/JAVA/.NET
  3. cms小猪o2o企业付款配置中微信提现配置实现商家转账到零钱(企业付款到零钱)解决:“操作失败!产品权限验证失败,请查看您当前是否具有该产品的权限“的错误提示
  4. Android 适配 64 位架构
  5. KEIL4/5的背景色修改
  6. android 华为手机 log,华为手机打开log日志的方法的方法
  7. 微信小程序如何获取数组下标
  8. STM8内部EEPROM的使用详解
  9. html输入框电话代码,电话号码输入框测试用例
  10. python画结节图像_天池医疗AI大赛[第一季]:肺部结节U-Net图像分割