python3应用windows api对后台程序窗口及桌面截图并保存的方法


Posted in Python onAugust 27, 2019

python的版本及依赖的库的安装

#版本python 3.7.1
pip install pywin32==224
pip install numpy==1.15.3
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16
pip install Pillow-PIL==0.1.dev0

对后台窗口截图

#对后台窗口截图
import win32gui, win32ui, win32con
from ctypes import windll
from PIL import Image
import cv2
import numpy

#获取后台窗口的句柄,注意后台窗口不能最小化
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)

#如果要截图到打印设备:
###最后一个int参数:0-保存整个窗口,1-只保存客户区。如果PrintWindow成功函数返回值为1
#result = windll.user32.PrintWindow(hWnd,saveDC.GetSafeHdc(),0)
#print(result) #PrintWindow成功则输出1

#保存图像
##方法一:windows api保存
###保存bitmap到文件
saveBitMap.SaveBitmapFile(saveDC,"img_Winapi.bmp")

##方法二(第一部分):PIL保存
###获取位图信息
bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)
###生成图像
im_PIL = Image.frombuffer('RGB',(bmpinfo['bmWidth'],bmpinfo['bmHeight']),bmpstr,'raw','BGRX',0,1)
##方法二(后续转第二部分)

##方法三(第一部分):opencv+numpy保存
###获取位图信息
signedIntsArray = saveBitMap.GetBitmapBits(True)
##方法三(后续转第二部分)

#内存释放
win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hWnd,hWndDC)

##方法二(第二部分):PIL保存
###PrintWindow成功,保存到文件,显示到屏幕
im_PIL.save("im_PIL.png") #保存
im_PIL.show() #显示

##方法三(第二部分):opencv+numpy保存
###PrintWindow成功,保存到文件,显示到屏幕
im_opencv = numpy.frombuffer(signedIntsArray, dtype = 'uint8')
im_opencv.shape = (height, width, 4)
cv2.cvtColor(im_opencv, cv2.COLOR_BGRA2RGB)
cv2.imwrite("im_opencv.jpg",im_opencv,[int(cv2.IMWRITE_JPEG_QUALITY), 100]) #保存
cv2.namedWindow('im_opencv') #命名窗口
cv2.imshow("im_opencv",im_opencv) #显示
cv2.waitKey(0)
cv2.destroyAllWindows()

对桌面截图

# 截图整个桌面
import win32gui
import win32ui
import win32con
import win32api

# 获取桌面
hdesktop = win32gui.GetDesktopWindow()
# 分辨率适应
width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
# 创建设备描述表
desktop_dc = win32gui.GetWindowDC(hdesktop)
img_dc = win32ui.CreateDCFromHandle(desktop_dc)
# 创建一个内存设备描述表
mem_dc = img_dc.CreateCompatibleDC()
# 创建位图对象
screenshot = win32ui.CreateBitmap()
screenshot.CreateCompatibleBitmap(img_dc, width, height)
mem_dc.SelectObject(screenshot)
# 截图至内存设备描述表
mem_dc.BitBlt((0, 0), (width, height), img_dc, (0, 0), win32con.SRCCOPY)
# 将截图保存到文件中
screenshot.SaveBitmapFile(mem_dc, 'screenshot.bmp')
# 内存释放
mem_dc.DeleteDC()
win32gui.DeleteObject(screenshot.GetHandle())

以上这篇python3应用windows api对后台程序窗口及桌面截图并保存的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详细解析Python当中的数据类型和变量
Apr 25 Python
python简单实现基数排序算法
May 16 Python
Python实现简单的文件传输与MySQL备份的脚本分享
Jan 03 Python
Google开源的Python格式化工具YAPF的安装和使用教程
May 31 Python
Python使用pandas处理CSV文件的实例讲解
Jun 22 Python
windows下安装Python虚拟环境virtualenvwrapper-win
Jun 14 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
Feb 18 Python
Python 列表反转显示的四种方法
Nov 16 Python
python 实现图片批量压缩的示例
Dec 18 Python
撤回我也能看到!教你用Python制作微信防撤回脚本
Jun 11 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 23 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 #Python
Python中Unittest框架的具体使用
Aug 27 #Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 #Python
Python3分析处理声音数据的例子
Aug 27 #Python
python中struct模块之字节型数据的处理方法
Aug 27 #Python
Python的bit_length函数来二进制的位数方法
Aug 27 #Python
使用python将excel数据导入数据库过程详解
Aug 27 #Python
You might like
PHP base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
php使用百度天气接口示例
2014/04/22 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
jQuery查询数据返回object和字符串影响原因是什么
2013/08/09 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
vue.js实现请求数据的方法示例
2017/02/07 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
浅谈React Native 传参的几种方式(小结)
2019/05/21 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
python解析模块(ConfigParser)使用方法
2013/12/10 Python
Python logging模块学习笔记
2014/05/24 Python
Python 对象中的数据类型
2017/05/13 Python
python3下载抖音视频的完整代码
2019/06/05 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
2020/02/07 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
销售人员中英文自荐信
2013/09/22 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
2015年元旦活动总结
2014/05/09 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
跑出一片天观后感
2015/06/08 职场文书
退休欢送会致辞
2015/07/31 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
spring 项目实现限流方法示例
2022/07/15 Java/Android