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 set常用操作函数集锦
Nov 15 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
用pandas按列合并两个文件的实例
Apr 12 Python
浅谈django rest jwt vue 跨域问题
Oct 26 Python
记一次python 内存泄漏问题及解决过程
Nov 29 Python
Python正则匹配判断手机号是否合法的方法
Dec 09 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
Apr 27 Python
python的launcher用法知识点总结
Aug 07 Python
安装并免费使用Pycharm专业版(学生/教师)
Sep 24 Python
 python中的元类metaclass详情
May 30 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中session_unset与session_destroy的区别分析
2011/06/16 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
用javascript实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
2007/04/20 Javascript
Ext 表单布局实例代码
2009/04/30 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
JS冒泡事件的快速解决方法
2013/12/16 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
js常用DOM方法详解
2017/02/04 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
python学生管理系统
2019/01/30 Python
值得收藏的10道python 面试题
2019/04/15 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
如何一键升级Python所有包
2020/11/05 Python
Python爬虫教程之利用正则表达式匹配网页内容
2020/12/08 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
机械设计职业生涯规划书
2013/12/27 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL
字节飞书面试promise.all实现示例
2022/06/16 Javascript