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中type的构造函数参数含义说明
Jun 21 Python
python实现文本去重且不打乱原本顺序
Jan 26 Python
python使用matplotlib画饼状图
Sep 25 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
解决tensorflow 释放图,删除变量问题
Jun 23 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
Python+Kepler.gl实现时间轮播地图过程解析
Jul 20 Python
Django静态文件加载失败解决方案
Aug 26 Python
python 装饰器的基本使用
Jan 13 Python
python 制作本地应用搜索工具
Feb 27 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
重置版游戏视频
2020/04/09 魔兽争霸
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
一个PHP并发访问实例代码
2012/09/06 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
用JS剩余字数计算的代码
2008/07/03 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
关于jQuery库冲突的完美解决办法
2017/05/20 jQuery
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
django 取消csrf限制的实例
2020/03/13 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
html5指南-1.html5全局属性(html5 global attributes)深入理解
2013/01/07 HTML / CSS
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
linux下进程间通信的方式
2013/01/23 面试题
Servlet面试题库
2015/07/18 面试题
新员工欢迎词
2014/01/12 职场文书
将相和教学反思
2014/02/04 职场文书
亲戚结婚的请假条
2014/02/11 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书