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使用django获取用户IP地址的方法
May 11 Python
机器学习的框架偏向于Python的13个原因
Dec 07 Python
Python实现的购物车功能示例
Feb 11 Python
Matplotlib 生成不同大小的subplots实例
May 25 Python
Python全局变量与局部变量区别及用法分析
Sep 03 Python
Python正则表达式匹配日期与时间的方法
Jul 07 Python
3种python调用其他脚本的方法
Jan 06 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
Apr 26 Python
django日志默认打印request请求信息的方法示例
May 17 Python
浅析Python __name__ 是什么
Jul 07 Python
python之openpyxl模块的安装和基本用法(excel管理)
Feb 03 Python
AI:如何训练机器学习的模型
Apr 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去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
yii gridview实现时间段筛选功能
2017/08/15 PHP
js 页面输出值
2008/11/30 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
Python程序员面试题 你必须提前准备!(答案及解析)
2018/01/23 Python
python取余运算符知识点详解
2019/06/27 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
老师给学生的表扬信
2014/01/17 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
暑期学习心得体会
2014/09/02 职场文书
结婚十年感言
2015/07/31 职场文书
汽车销售员工作总结
2015/08/12 职场文书