如何解决屏幕截图的尺寸与 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 图像,以便我可以查看它。请注意,所需的坐标与最初用于移动窗口的坐标相同。但是,当我尝试运行此程序时,屏幕截图并未捕获整个窗口!
我曾尝试查看 MoveWindow
和 BitBlt
函数的文档,但找不到问题所在。目标和源矩形参数假定为 (0,0),因为 MoveWindow
函数。宽度和高度参数相同。我也尝试过使用 bRepaint
参数进行试验,但没有任何区别。
有什么建议吗?
解决方法
在对这个问题进行了多一点试验后,我终于找到了问题所在。
在评论中,我说 ctypes.windll.shcore.SetProcessDpiAwareness(1)
不起作用。然而,它做到了。当我放大高度和宽度时,屏幕截图和窗口之间的尺寸非常适合。但是,宽度和高度对较小尺寸不起作用的原因(我最初将宽度和高度设置为 500)是因为 Microsoft Edge 不允许这样做。如果宽度在某个阈值内,则窗口的实际宽度将变为 Microsoft Edge 想要的最小宽度。一个简单的解决方法是将宽度和高度设置为更大的分辨率,它奏效了!
非常感谢评论中的每个人,尤其是@IInspectable。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。