欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-08 22:58:07
...

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

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

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

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

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

In [1]: from win32.win32api import GetSystemMetrics

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

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

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

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

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