屏幕截图的尺寸与 Pywin32 中调整大小的窗口的尺寸不匹配

如何解决屏幕截图的尺寸与 Pywin32 中调整大小的窗口的尺寸不匹配

我正在尝试使用 pywin32 截取 Microsoft Edge 窗口的屏幕截图。然后将此屏幕截图用于机器学习算法以在 Microsoft Edge 中玩游戏。正如您可能猜到的那样,该程序将多次截取屏幕截图,因此我需要尽可能快地截取屏幕截图。为了提高速度,我的程序会将 Microsoft Edge 窗口的大小调整为较小的分辨率(特别是 600 x 600)。但是,即使我已将其移动到指定位置,屏幕截图也未显示整个窗口。

我的程序:

import win32gui 
import win32ui 
import win32con 
import win32api  
from PIL import Image
import time



# grab a handle to the main desktop window 
hdesktop = win32gui.GetDesktopWindow() 

 
# determine the size of all monitors in pixels 
width = 600
height = 600 
left = 0 
top = 0 
 
# set window to correct location
print("You have 3 second to click the desired window!")
for i in range(3,-1):
    print(i)
    time.sleep(1)
hwnd = win32gui.GetForegroundWindow()
win32gui.MoveWindow(hwnd,width,height,True)
 
# create a device context 
desktop_dc = win32gui.GetWindowDC(hdesktop) 
img_dc = win32ui.CreateDCFromHandle(desktop_dc) 
 
# create a memory based device context 
mem_dc = img_dc.CreateCompatibleDC() 
 
# create a bitmap object 
screenshot = win32ui.CreateBitmap() 
screenshot.CreateCompatibleBitmap(img_dc,height) 
mem_dc.SelectObject(screenshot) 
 
 
# copy the screen into our memory device context 
mem_dc.BitBlt((0,0),(width,height),img_dc,(left,top),win32con.SRCCOPY) 
 

bmpinfo = screenshot.GetInfo()
bmpstr = screenshot.GetBitmapBits(True)
im = Image.frombuffer(
    'RGB',(bmpinfo['bmWidth'],bmpinfo['bmHeight']),bmpstr,'raw','BGRX',1)

im.show()
# free our objects 
mem_dc.DeleteDC() 
win32gui.DeleteObject(screenshot.GetHandle()) 

我的程序首先通过win32gui.GetForegroundWindow()移动并调整所需窗口的大小(取自win32gui.MoveWindow(hwnd,True))然后,它尝试通过获取整个桌面窗口(hdesktop = win32gui.GetDesktopWindow() )来截取窗口的屏幕截图,然后将其裁剪到所需的坐标 (mem_dc.BitBlt((0,win32con.SRCCOPY) )。然后我将 win32 屏幕截图转换为 PIL 图像,以便我可以查看它。请注意,所需的坐标与最初用于移动窗口的坐标相同。但是,当我尝试运行此程序时,屏幕截图并未捕获整个窗口!

我曾尝试查看 MoveWindowBitBlt 函数的文档,但找不到问题所在。目标和源矩形参数假定为 (0,0),因为 MoveWindow 函数。宽度和高度参数相同。我也尝试过使用 bRepaint 参数进行试验,但没有任何区别。

有什么建议吗?


解决方法

在对这个问题进行了多一点试验后,我终于找到了问题所在。 在评论中,我说 ctypes.windll.shcore.SetProcessDpiAwareness(1) 不起作用。然而,它做到了。当我放大高度和宽度时,屏幕截图和窗口之间的尺寸非常适合。但是,宽度和高度对较小尺寸不起作用的原因(我最初将宽度和高度设置为 500)是因为 Microsoft Edge 不允许这样做。如果宽度在某个阈值内,则窗口的实际宽度将变为 Microsoft Edge 想要的最小宽度。一个简单的解决方法是将宽度和高度设置为更大的分辨率,它奏效了!

非常感谢评论中的每个人,尤其是@IInspectable。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-