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实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
django输出html内容的实例
May 27 Python
python验证码识别教程之滑动验证码
Jun 04 Python
python字符串循环左移
Mar 08 Python
浅谈python标准库--functools.partial
Mar 13 Python
PyQt5 QTable插入图片并动态更新的实例
Jun 18 Python
Python获取统计自己的qq群成员信息的方法
Nov 15 Python
在python shell中运行python文件的实现
Dec 21 Python
TensorBoard 计算图的可视化实现
Feb 15 Python
jupyter notebook 增加kernel教程
Apr 10 Python
解决Opencv+Python cv2.imshow闪退问题
Apr 24 Python
解决Keras 自定义层时遇到版本的问题
Jun 16 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备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
PHP编码转换
2012/11/05 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
thinkPHP5分页功能实现方法分析
2017/10/25 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
javascript设计模式 接口介绍
2012/07/24 Javascript
javascript-简单的计算器实现步骤分解(附图)
2013/05/30 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
js Dom实现换肤效果
2017/10/21 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
利用python打开摄像头及颜色检测方法
2018/08/03 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
Django密码系统实现过程详解
2019/07/19 Python
Python-接口开发入门解析
2019/08/01 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
在职党员进社区活动总结
2014/07/05 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
公司搬迁通知
2015/04/20 职场文书
个人廉政承诺书
2015/04/28 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python