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中的sort方法使用详解
Jul 25 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
Python中字符串格式化str.format的详细介绍
Feb 17 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 Python
python实现QQ批量登录功能
Jun 19 Python
python config文件的读写操作示例
Sep 27 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
Python tkinter布局与按钮间距设置方式
Mar 04 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
Jul 20 Python
python 基于pygame实现俄罗斯方块
Mar 02 Python
Django开发RESTful API实现增删改查(入门级)
May 10 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遍历数组的几种方法
2012/03/22 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
javascript 动态添加事件代码
2008/11/30 Javascript
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
js实现随机点名
2021/01/19 Javascript
python用reduce和map把字符串转为数字的方法
2016/12/19 Python
Flask框架信号用法实例分析
2018/07/24 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
毕业生求职推荐信
2013/11/04 职场文书
上课迟到检讨书
2014/02/19 职场文书
新教师培训方案
2014/06/08 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
幼儿园辞职书
2015/02/26 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
学校教学管理制度
2015/08/06 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技