如果你在網上去搜如何用 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