【Pywin32】使用“memdc.BitBlt((0, 0), (width, height), srcdc, (0, 0), win32con.SRCCOPY)”截图不全的调试笔记

问题描述

今天在使用“memdc.BitBlt((0, 0), (width, height), srcdc, (0, 0), win32con.SRCCOPY)”获取窗口截图的时候遇到一个问题:

截取的图像不完整,图像的右下角看起来有缺失

于是在Poe上咨询了一下:

Claude100k:根据你提供的代码,获取窗口截图这部分主要是通过win32gui模块实现的,似乎获取到的图片非常小,(中略)

可能的原因一:获取的窗口大小rect错误

在代码中是通过GetWindowRect()来获取窗口的大小,然后根据这个大小创建位图并绘制窗口内容。如果获取到的rect大小不正确,那么就会导致位图创建的大小也不正确,获取到的图片就会很小。

可以打印出rect,确认它获取到的窗口大小是否正确。

调试过程

打印rect:查看窗口尺寸是否正确

根据Claude100k的建议,我们打印输出了正确版本和错误版本代码的rect,发现的确不一样,

Correct:	(200, 45, 2360, 1395)
Wrong:		(133, 30, 1573, 930)

错误版坐标似乎要小一些,怪不得观察会看到“右下角和右侧会有缺失”,这里可知错误版代码获取的窗口尺寸是有问题的;

对比代码:看看两份代码到底哪里不一样

这两份代码看起来是差不多的,咨询了一下ChatGPT,他也不清楚到底是哪里有不同;
通过观察难以发现差别的情况下,手动逐行调试是一个终极的选项

相关提示:之前听大佬说过,import语句也会引入一些设置,导致后续代码出现差异性的结果

注释对比:使用二分法注释代码,找出到底是哪一行代码引起差异

我们自下往上的顺序注释了引入pyautogui的初始化代码;

调试结果:因为引入不同的包导致了结果不同

# 第1层引入
import pyautogui
# 第2层引入
import pyscreeze
# 第3层DPI感知设置
import ctypes
ctypes.windll.user32.SetProcessDPIAware()
### 回答1: pywin32-221.win并不支持3.8版本。pywin32是一个用于与Windows操作系统进行交互的Python扩展模块,它提供了访问Windows API功能的接口。然而,每个pywin32版本只支持特定的Python版本。根据官方网站的信息,目前pywin32-221.win只支持Python 2.3到3.7版本。因此,如果你想在Python 3.8的环境中使用pywin32,你需要寻找一个兼容pywin32-221.win版本的解决方案或者等待官方发布支持Python 3.8的更新版本。在等待期间,你可以考虑使用其他可用的库或工具来满足你的需求。 ### 回答2: 根据我所了解到的信息,pywin32-221.win安装包目前还没有适用于Python 3.8版本的版本。pywin32是一个用于Python的第三方库,主要用于在Windows系统上进行系统编程,包括操作窗口、消息传递、注册表、文件访问等功能。该库由于其强大的功能和广泛的应用,备受Python开发者的喜爱。 然而,每当发布了新的Python版本,通常都需要等待第三方库的开发者进行适配和更新,以确保与新版本的Python兼容。截至目前,pywin32-221.win还未支持Python 3.8版本,可能是因为在新版本中有一些API变化或其他改动,需要开发者进行相应的适配工作。 如果您希望在Python 3.8版本中使用pywin32库,我建议您关注官方或第三方库的更新动态,以及检查其他可能的解决方案。同时,您还可以参考文档、论坛或社区等资源,了解其他开发者的经验和建议,或者尝试直接联系pywin32开发者,了解他们是否有计划支持Python 3.8版本。 ### 回答3: 目前的pywin32版本中,还没有针对Python 3.8版本的pywin32-221.win版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值