【Python】获取屏幕真实分辨率、缩放后的分辨率以及缩放比例

如果你在网上去搜如何用 Python 获取屏幕分辨率,那么肯定一堆人会告诉你用 win32 接口的 GetSystemMetrics 函数就可以了。

这虽然没错,但其实有一点疏漏。就是 GetSystemMetrics 获取的只是经过系统记录的分辨率,而非物理真实的分辨率。

所以会出现这种偏差,是因为在windows系统里面有一种叫做缩放的神奇东西,那些屏幕分辨率比较高的朋友对这玩意应该不陌生。

在这里插入图片描述

上图是我的电脑的设置,我设置的是 2560x1600,缩放率为 200%,所以调用 GetSystemMetrics 的结果为:

In [1]: from win32.win32api import GetSystemMetrics

In [2]: GetSystemMetrics(0), GetSystemMetrics(1)
Out[2]: (1280, 800)

我随便修改一下缩放,设置缩放比例为 250%

在这里插入图片描述

这回再次运行的时候就变了:

In [4]: GetSystemMetrics(0), GetSystemMetrics(1)
Out[4]: (1024, 640)

注意到规律了吗?

( 1280 , 800 ) × 2 = ( 2560 , 1600 ) ( 1024 , 640 ) × 2.5 = ( 2560 , 1600 ) (1280, 800) \times 2 = (2560, 1600)\\ (1024, 640) \times 2.5 = (2560, 1600)

那如果想要获得未经过缩放的分辨率 2560 x 1600 咋办呢?可以这么干:

In [9]: from win32 import win32api, win32gui, win32print
In [10]: import win32con
In [11]: hDC = win32gui.GetDC(0)
In [12]: w = win32print.GetDeviceCaps(hDC, win32con.DESKTOPHORZRES)
In [13]: h = win32print.GetDeviceCaps(hDC, win32con.DESKTOPVERTRES)
In [14]: w, h
Out[14]: (2560, 1600)

最后附上完整的代码。

from win32 import win32api, win32gui, win32print
from win32.lib import win32con

from win32.win32api import GetSystemMetrics


def get_real_resolution():
    """获取真实的分辨率"""
    hDC = win32gui.GetDC(0)
    # 横向分辨率
    w = win32print.GetDeviceCaps(hDC, win32con.DESKTOPHORZRES)
    # 纵向分辨率
    h = win32print.GetDeviceCaps(hDC, win32con.DESKTOPVERTRES)
    return w, h


def get_screen_size():
    """获取缩放后的分辨率"""
    w = GetSystemMetrics (0)
    h = GetSystemMetrics (1)
    return w, h

real_resolution = get_real_resolution()
screen_size = get_screen_size()
print(real_resolution)
print(screen_size)

screen_scale_rate = round(real_resolution[0] / screen_size[0], 2)
print(screen_scale_rate)

显示分辨率: (2560, 1600)
缩放后的分辨率: (1280, 800)
缩放比率: 2.0

猜你喜欢

转载自blog.csdn.net/frostime/article/details/104798061