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中利用sorted()函数排序的简单教程
Apr 27 Python
在Lighttpd服务器中运行Django应用的方法
Jul 22 Python
Python采用Django开发自己的博客系统
Sep 29 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
python3.4爬虫demo
Jan 22 Python
Flask框架工厂函数用法实例分析
May 25 Python
Python学习笔记之自定义函数用法详解
Jun 08 Python
python之拟合的实现
Jul 19 Python
Python-split()函数实例用法讲解
Dec 18 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 Python
Python中tkinter的用户登录管理的实现
Apr 22 Python
Pandas 数据编码的十种方法
Apr 20 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 分页类(模仿google)-面试题目解答
2009/09/13 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
thinkPHP5.0框架独立配置与动态配置方法
2017/03/17 PHP
javascript 打印页面代码
2009/03/24 Javascript
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
JQuery index()方法使用代码
2010/06/02 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python中replace方法实例分析
2014/08/20 Python
Python中装饰器高级用法详解
2017/12/25 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
python属于哪种语言
2020/08/16 Python
python matplotlib库的基本使用
2020/09/23 Python
英国工具中心:UK Tool Centre
2017/07/10 全球购物
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
法国二手MacBook销售网站:Okamac
2019/03/18 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
历史专业大学生职业生涯规划书
2014/03/13 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
欢迎词范文
2015/01/27 职场文书
导游词之山东孔庙
2019/11/04 职场文书