最近心血来潮想自己用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. Android Market 链接的生成与分享
  2. 怎么判断网络回路_PLC控制回路故障的判断和检修方法与技巧!
  3. Android开发--FileInputStream/OutStream/Sdcard写入
  4. Oracle 要慌了!华为终于开源了自家的 Huawei JDK——毕昇 JDK!
  5. 科大星云诗社动态20220113
  6. 8086CPU汇编:一般的标号与直接定址标号
  7. 只提取单元格中的数字_提取Excel单元格中的数字(4类)及原理
  8. 肝了一个月,我做了个免费的面试刷题网
  9. 这些面试中经常被问到的线程池问题,你都能回答的上来吗?
  10. recurdyn和matlab联合仿真,基于RecurDyn与Simulink的液压破碎锤联合仿真与试验分析
  11. Python-while 计算100以内奇数和
  12. 英语国际音标发音——见标能读
  13. 计算机基础ps变换蝴蝶,在PS中用自由变换制作飞舞的蝴蝶和用内容识别比例缩放的操作过程...
  14. ai人工智能让女神_人工智能可能只会让你兴奋不已
  15. MAC常用进入文件夹剪贴粘贴打开文件夹快捷键
  16. 支持小米java文件阅读器_小米开源文件管理器MiCodeFileExplorer-源码研究(0)-初步研究...
  17. Markdown标记语法Typora编辑器零基础入门新手学习使用总结教程
  18. 计算机缩写术语完全介绍 By 001pc @ 1997.10.1-2004-6-12
  19. Linux (centos7)安装字体
  20. 基于51单片机---遥控灯

热门文章

  1. oppo--软件测试工程师岗位面试总结(二)
  2. java 实现逆波兰表达式_逆波兰表达式java实现
  3. 设定自动弹窗html,javascript如何设置弹窗?
  4. 大环境不确定,高端IT人才独有的大趋势在哪?|猿代码科技
  5. c 易语言 cpu序列号,易语言汇编取CPU序列号
  6. Docker夺命连环15问,你能坚持第几问?
  7. 软件架构与设计(四)-----数据流架构
  8. 合并两个有序链表(java算法)
  9. JavaScript 操作元素案例练习
  10. jenkins下载地址deb包