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正则表达式使用范例分享
Dec 04 Python
Python 装饰器深入理解
Mar 16 Python
Python入门之三角函数tan()函数实例详解
Nov 08 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
浅析python的优势和不足之处
Nov 20 Python
python实现QQ邮箱/163邮箱的邮件发送
Jan 22 Python
python使用selenium实现批量文件下载
Mar 11 Python
浅谈Python基础—判断和循环
Mar 22 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
Feb 15 Python
Python通过队列来实现进程间通信的示例
Oct 14 Python
基于Python爬取京东双十一商品价格曲线
Oct 23 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 中dirname(_file_)讲解
2007/03/18 PHP
PHP中MD5函数使用实例代码
2008/06/07 PHP
ezSQL PHP数据库操作类库
2010/05/16 PHP
php计算函数执行时间的方法
2015/03/20 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
2016/03/08 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
2017/03/14 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
Vue常用指令详解分析
2018/08/19 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
Python入门篇之列表和元组
2014/10/17 Python
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
django的登录注册系统的示例代码
2018/05/14 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
请说出以下代码输出什么
2013/08/30 面试题
夜大毕业生自我评价分享
2013/11/10 职场文书
股权转让协议书
2014/04/12 职场文书
党建工作整改措施
2014/10/28 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android