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中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
May 29 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
python dict 相同key 合并value的实例
Jan 21 Python
python实现合并两个排序的链表
Mar 03 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
解决TensorFlow模型恢复报错的问题
Feb 06 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
浅谈Python描述数据结构之KMP篇
Sep 06 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 Python
Python集合set()使用的方法详解
Mar 18 Python
Python必备技巧之函数的使用详解
Apr 04 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+MSSQL分页的例子
2006/10/09 PHP
php db类库进行数据库操作
2009/03/19 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
xss文件页面内容读取(解决)
2010/11/28 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
详解vue中computed 和 watch的异同
2017/06/30 Javascript
Vue header组件开发详解
2018/01/26 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
Python抓取手机号归属地信息示例代码
2016/11/28 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
python访问hdfs的操作
2020/06/06 Python
什么是python的必选参数
2020/06/21 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
大学生实习自我鉴定
2013/12/11 职场文书
美术教学感言
2014/02/22 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
python实现批量移动文件
2021/04/05 Python
Redis keys命令的具体使用
2022/06/05 Redis