Python 以编程方式更改windows分辨率

Python 以编程方式更改windows分辨率,python,windows,screen-resolution,Python,Windows,Screen Resolution,我使用下面的代码段通过python更改windows的屏幕分辨率,它在1366x768、1024x768、800x600分辨率下运行良好。但它不适用于1440x810分辨率。这里怎么了 import ctypes import struct import sys def set_res(width, height, bpp=32): DM_BITSPERPEL = 0x00040000 DM_PELSWIDTH = 0x00080000 DM_PELSHEIGHT =

我使用下面的代码段通过python更改windows的屏幕分辨率,它在1366x768、1024x768、800x600分辨率下运行良好。但它不适用于1440x810分辨率。这里怎么了

import ctypes
import struct
import sys

def set_res(width, height, bpp=32):
    DM_BITSPERPEL = 0x00040000
    DM_PELSWIDTH = 0x00080000
    DM_PELSHEIGHT = 0x00100000
    CDS_UPDATEREGISTRY = 0x00000001
    SIZEOF_DEVMODE = 148

    user32 = ctypes.WinDLL('user32.dll')
    DevModeData = struct.calcsize("32BHH") * '\x00'
    DevModeData += struct.pack("H", SIZEOF_DEVMODE)
    DevModeData += struct.calcsize("H") * '\x00'
    dwFields = (width and DM_PELSWIDTH or 0) | (height and DM_PELSHEIGHT or 0) | (bpp and DM_BITSPERPEL or 0)
    DevModeData += struct.pack("L", dwFields)
    DevModeData += struct.calcsize("l9h32BHL") * '\x00'
    DevModeData += struct.pack("LLL", bpp or 0, width or 0, height or 0)
    DevModeData += struct.calcsize("8L") * '\x00'
    result = user32.ChangeDisplaySettingsA(DevModeData, CDS_UPDATEREGISTRY)
    return result == 0 # success if zero, some failure otherwise

if(__name__ == "__main__"):
    result = set_res(1440, 810)
    sys.exit(result)

选中“我的系统”屏幕分辨率选项可用

它有以下可用的分辨率选项

脚本对上述所有选项都很有效

请注意,1440 x 810分辨率选项不可用,因此它在我的系统上也不起作用。


可能存在的问题与该系统对屏幕分辨率的支持有关,而不是特定于上述代码。

您必须具有windows支持的分辨率才能工作

对于希望python 3.x使用此脚本的用户,请使用以下命令:

import ctypes
import struct
import sys

def set_res(width, height, bpp=32):
    DM_BITSPERPEL = 0x00040000
    DM_PELSWIDTH = 0x00080000
    DM_PELSHEIGHT = 0x00100000
    CDS_UPDATEREGISTRY = 0x00000001
    SIZEOF_DEVMODE = 148

    user32 = ctypes.WinDLL('user32.dll')
    DevModeData = struct.calcsize("32BHH") * bytes('\x00','utf')
    DevModeData += struct.pack("H", SIZEOF_DEVMODE)
    DevModeData += struct.calcsize("H") * bytes('\x00','utf')
    dwFields = (width and DM_PELSWIDTH or 0) | (height and DM_PELSHEIGHT or 0) | (bpp and DM_BITSPERPEL or 0)
    DevModeData += struct.pack("L", dwFields)
    DevModeData += struct.calcsize("l9h32BHL") * bytes('\x00','utf')
    DevModeData += struct.pack("LLL", bpp or 0, width or 0, height or 0)
    DevModeData += struct.calcsize("8L") * bytes('\x00','utf')
    result = user32.ChangeDisplaySettingsA(DevModeData, CDS_UPDATEREGISTRY)
    return result == 0  # success if zero, some failure otherwise

if(__name__ == "__main__"):
    result = set_res(1280, 720)
    sys.exit(result)

ChangeDisplaySettings返回什么结果?GetLastError中还有其他内容吗?但我猜这是因为这不是一个受支持的分辨率:我从来没有听说过810高。@Rup它返回-2这是DISP_CHANGE_BADMODE:图形模式不受支持。找到了一个要链接的副本,但它是一个非常大和缓慢的页面: