从Python脚本查询windows10/8监视器缩放?

2024-10-01 00:32:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python3.6编写了一个应用程序,我想运行一个命令,看看在Windows 10或8中显示器的当前缩放比例是多少—类似于下面的如何返回屏幕分辨率:

user32 = ctypes.windll.user32
screensize_l = user32.GetSystemMetrics(0)
screensize_w = user32.GetSystemMetrics(1)

我知道最简单的方法可能是让我的应用程序DPI感知,但是这样做会在我的应用程序中造成很多额外的问题,所以我想避免这个选项。在

我查阅了windows文档,认为“GetDpiForMonitor”或“GetScaleFactorForMonitor”可能是我想要的,但不知道如何实现这些命令。在

我已经使用了win32api和ctypes,所以任何依赖于这两者之一的东西都可以-任何帮助都将非常感谢!在


Tags: 方法命令应用程序屏幕windows选项分辨率ctypes
1条回答
网友
1楼 · 发布于 2024-10-01 00:32:14

在Windows 10上,以下代码(您需要pywin32):

import ctypes
import win32api

PROCESS_PER_MONITOR_DPI_AWARE = 2
MDT_EFFECTIVE_DPI = 0

def print_dpi():
    shcore = ctypes.windll.shcore
    monitors = win32api.EnumDisplayMonitors()
    hresult = shcore.SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE)
    assert hresult == 0
    dpiX = ctypes.c_uint()
    dpiY = ctypes.c_uint()
    for i, monitor in enumerate(monitors):
        shcore.GetDpiForMonitor(
            monitor[0].handle,
            MDT_EFFECTIVE_DPI,
            ctypes.byref(dpiX),
            ctypes.byref(dpiY)
        )
        print(
            f"Monitor {i} (hmonitor: {monitor[0]}) = dpiX: {dpiX.value}, dpiY: {dpiY.value}"
        )


if __name__ == "__main__":
    print_dpi()

在我的机器上,有3个监视器和1个缩放到125%的输出:

^{pr2}$

如果不想将自己的应用程序设置为支持dpi的每个监视器,可以尝试使用multiprocessing模块在另一个进程中启动上述代码的某些变体并检索结果。在

希望这有帮助。在

相关问题 更多 >