使用缩放监视器捕获 Python 应用程序

Posted

技术标签:

【中文标题】使用缩放监视器捕获 Python 应用程序【英文标题】:Python app capturing with scaling monitor 【发布时间】:2020-12-30 09:39:33 【问题描述】:

我正在尝试捕获一个窗口(在示例代码中我将使用 firefox),我正在运行 2 个监视器,第一个 2736x1824 具有 200% 缩放比例,第二个 1920x1080 具有 100% 缩放比例。

    from win32 import win32gui

    def enum_cb(hwnd, results):
       # CallBack function for enumeration
       winlist.append((hwnd, win32gui.GetWindowText(hwnd)))
    def get_screens():
        win32gui.EnumWindows(enum_cb, winlist)
        return [(hwnd, title) for hwnd, title in winlist if title]
    def get_screensbyname(screen_name):
       # Function who gets a screen by name
       winlist = get_screens()
       screens = [(hwnd, title) for hwnd, title in winlist if screen_name in title.lower()]
       while len(screens) <= 0:
           winlist = get_screens()
           screens = [(hwnd, title) for hwnd, title in winlist if screen_name in title.lower()]
       return screens
    winlist = []
    windows = get_screensbyname('firefox')
    window = windows[0][0]
    wRect = win32gui.GetWindowRect(window)
    cRect = win32gui.GetClientRect(window)
    print('GetWindowRect ', wRect)
    print('GetCLientRect ', cRect)

如果窗口在它输出的第一个屏幕上

GetWindowRect (-7, -7, 1374, 878)
GetCLientRect (0, 0, 1368, 878)

如果窗口在输出的第二个屏幕上

GetWindowRect (2728, 345, 4664, 1401)
GetCLientRect (0, 0, 1920, 1048)

现在,据我了解,它忽略了显示器上给定的缩放比例。因为如果我手动应用缩放(使用计算器),第一个输出将更改为

GetWindowRect (-14, -14, 2748, 1756)
GetCLientRect (0, 0, 2736, 1756)

如何应用在窗口所在的显示器上设置的缩放或 dpi awerness?

我需要它来捕获内部区域并将其流式传输到文件或其他屏幕上

【问题讨论】:

【参考方案1】:

解决方法比较简单,添加以下几行

import ctypes
ctypes.windll.shcore.SetProcessDpiAwareness(2)

它也可以设置 SetProcessDpiAwareness(1) 不知道这两者之间的区别。 如果有人能解释一下就好了。

注意:这个答案明天将被设置为解决方案

【讨论】:

以上是关于使用缩放监视器捕获 Python 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

python 设置数据包捕获的监视器接口设置

Win32:捕获句柄到显示监视器

为不同大小的监视器缩放 Windows 窗体中的组件 - Visual Basic

mapbox监视zoom的事件

Cocoa:在 Swift 中保存时捕获屏幕并缩放图像

带有缩放的 Windows 屏幕截图