【Python】获取屏幕真实分辨率、缩放后的分辨率以及缩放比例
程序员文章站
2022-06-08 22:58:07
...
如果你在网上去搜如何用 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)
注意到规律了吗?
那如果想要获得未经过缩放的分辨率 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