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

问题描述

我正在尝试捕获一个窗口(在示例代码中,我将使用 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 in winlist if screen_name in title.lower()]
       while len(screens) <= 0:
           winlist = get_screens()
           screens = [(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,1368,878)

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

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

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

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

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

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

解决方法

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

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...