从 Python 脚本查询 Windows 10/8 监视器缩放?
Query Windows 10/8 Monitor Scaling from Python Script?
我已经在 python 3.6 中编写了一个应用程序,并且想要 运行 一个命令来查看监视器的当前缩放比例是 Windows 10 或 8 - 类似以下 returns 屏幕分辨率如何:
user32 = ctypes.windll.user32
screensize_l = user32.GetSystemMetrics(0)
screensize_w = user32.GetSystemMetrics(1)
我知道最简单的方法可能是让我的应用程序知道 DPI,但这样做会导致我的应用程序出现很多其他问题 - 所以我想避免使用此选项。
我查看了 windows 文档并认为 "GetDpiForMonitor" 或 "GetScaleFactorForMonitor" 可能是我正在寻找的,但不知道如何实现这些命令。
我已经使用了 win32api 和 ctypes,所以任何依赖于其中任何一个的东西都可以 - 任何帮助将不胜感激!
关于Windows10,如下代码(需要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% 的机器给出以下输出:
Monitor 0 (hmonitor: <PyHANDLE:65539>) = dpiX: 96, dpiY: 96
Monitor 1 (hmonitor: <PyHANDLE:65537>) = dpiX: 120, dpiY: 120
Monitor 2 (hmonitor: <PyHANDLE:65541>) = dpiX: 96, dpiY: 96
如果您不想将自己的应用程序设置为每个监视器的 dpi 感知,您可以尝试使用 multiprocessing
模块在另一个进程中启动上述代码的一些变体并检索结果。
希望这对您有所帮助。
我已经在 python 3.6 中编写了一个应用程序,并且想要 运行 一个命令来查看监视器的当前缩放比例是 Windows 10 或 8 - 类似以下 returns 屏幕分辨率如何:
user32 = ctypes.windll.user32
screensize_l = user32.GetSystemMetrics(0)
screensize_w = user32.GetSystemMetrics(1)
我知道最简单的方法可能是让我的应用程序知道 DPI,但这样做会导致我的应用程序出现很多其他问题 - 所以我想避免使用此选项。
我查看了 windows 文档并认为 "GetDpiForMonitor" 或 "GetScaleFactorForMonitor" 可能是我正在寻找的,但不知道如何实现这些命令。
我已经使用了 win32api 和 ctypes,所以任何依赖于其中任何一个的东西都可以 - 任何帮助将不胜感激!
关于Windows10,如下代码(需要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% 的机器给出以下输出:
Monitor 0 (hmonitor: <PyHANDLE:65539>) = dpiX: 96, dpiY: 96
Monitor 1 (hmonitor: <PyHANDLE:65537>) = dpiX: 120, dpiY: 120
Monitor 2 (hmonitor: <PyHANDLE:65541>) = dpiX: 96, dpiY: 96
如果您不想将自己的应用程序设置为每个监视器的 dpi 感知,您可以尝试使用 multiprocessing
模块在另一个进程中启动上述代码的一些变体并检索结果。
希望这对您有所帮助。