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解析模块(ConfigParser)使用方法
Dec 10 Python
如何用itertools解决无序排列组合的问题
May 18 Python
Django实现组合搜索的方法示例
Jan 23 Python
利用python如何处理nc数据详解
May 23 Python
在python中利用opencv简单做图片比对的方法
Jan 24 Python
python对Excel按条件进行内容补充(推荐)
Nov 24 Python
Python实现结构体代码实例
Feb 10 Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
python爬虫请求头设置代码
Jul 28 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
Apr 14 Python
Python实现排序方法常见的四种
Jul 15 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
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
Gambit vs CL BO3 第二场 2.13
2021/03/10 DOTA
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
javascript使用substring实现的展开与收缩文字功能示例
2019/06/17 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
Python求导数的方法
2015/05/09 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
Python实现两款计算器功能示例
2017/12/19 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
德国童装购物网站:NICKI´S.com
2018/04/20 全球购物
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
经典c++面试题六
2012/01/18 面试题
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
有个性的自我评价范文
2013/11/15 职场文书
秋冬农业生产标语
2014/10/09 职场文书
python随机打印成绩排名表
2021/06/23 Python
Redis实现一个账号只能登录一个设备
2022/04/19 Redis
Django中celery的使用项目实例
2022/07/07 Python