You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows系统下如何用Python实现显示器旋转自动化?

Windows系统下如何用Python实现显示器旋转自动化?

兄弟,太懂你这种每次转显示器都要手动戳设置的麻烦了!你说的Ctrl+Alt+方向键没用的情况我也碰到过,大概率是显卡驱动没开启这个快捷键,或者系统设置里没给权限。另外ChatGPT给的那段代码可踩坑了——里面的DisplaySwitch.exe根本不是用来旋转屏幕的,它是管多显示器的复制/扩展切换的,完全跑偏了😂

给你整个靠谱的方案,直接调用Windows原生API来搞,不需要装花里胡哨的第三方库,Python自带的ctypes就能搞定:

import ctypes
from ctypes import wintypes

# 定义旋转角度对应的系统常量
DMDO_DEFAULT = 0  # 正常默认方向
DMDO_90 = 1       # 顺时针转90度
DMDO_180 = 2      # 顺时针转180度
DMDO_270 = 3      # 顺时针转270度

# 对接Windows系统API的结构定义和函数调用
user32 = ctypes.WinDLL('user32', use_last_error=True)

class DEVMODEW(ctypes.Structure):
    _fields_ = [
        ("dmDeviceName", wintypes.WCHAR * 32),
        ("dmSpecVersion", wintypes.WORD),
        ("dmDriverVersion", wintypes.WORD),
        ("dmSize", wintypes.WORD),
        ("dmDriverExtra", wintypes.WORD),
        ("dmFields", wintypes.DWORD),
        ("dmOrientation", wintypes.SHORT),
        ("dmPaperSize", wintypes.SHORT),
        ("dmPaperLength", wintypes.SHORT),
        ("dmPaperWidth", wintypes.SHORT),
        ("dmScale", wintypes.SHORT),
        ("dmCopies", wintypes.SHORT),
        ("dmDefaultSource", wintypes.SHORT),
        ("dmPrintQuality", wintypes.SHORT),
        ("dmColor", wintypes.SHORT),
        ("dmDuplex", wintypes.SHORT),
        ("dmYResolution", wintypes.SHORT),
        ("dmTTOption", wintypes.SHORT),
        ("dmCollate", wintypes.SHORT),
        ("dmFormName", wintypes.WCHAR * 32),
        ("dmLogPixels", wintypes.WORD),
        ("dmBitsPerPel", wintypes.DWORD),
        ("dmPelsWidth", wintypes.DWORD),
        ("dmPelsHeight", wintypes.DWORD),
        ("dmDisplayFlags", wintypes.DWORD),
        ("dmDisplayFrequency", wintypes.DWORD),
        ("dmICMMethod", wintypes.DWORD),
        ("dmICMIntent", wintypes.DWORD),
        ("dmMediaType", wintypes.DWORD),
        ("dmDitherType", wintypes.DWORD),
        ("dmReserved1", wintypes.DWORD),
        ("dmReserved2", wintypes.DWORD),
        ("dmPanningWidth", wintypes.DWORD),
        ("dmPanningHeight", wintypes.DWORD),
        ("dmDisplayOrientation", wintypes.DWORD),
        ("dmDisplayFixedOutput", wintypes.DWORD),
    ]

# 初始化系统需要的显示配置结构
devmode = DEVMODEW()
devmode.dmSize = ctypes.sizeof(DEVMODEW)
devmode.dmFields = 0x00000080  # 标记我们要修改屏幕旋转方向

def rotate_display(angle=DMDO_90, device_name=None):
    """
    旋转显示器屏幕的函数
    :param angle: 旋转角度,可选DMDO_DEFAULT/90/180/270
    :param device_name: 目标显示器的设备名称,默认操作主显示器
    """
    devmode.dmDisplayOrientation = angle
    # 调用系统API应用旋转设置
    result = user32.ChangeDisplaySettingsExW(
        device_name,
        ctypes.byref(devmode),
        None,
        0x00000040,  # 把设置保存到注册表,下次开机也生效
        None
    )
    if result != 0:
        raise RuntimeError(f"旋转失败啦,错误码: {result}")
    status_msg = f"屏幕已成功旋转{angle*90}度" if angle != DMDO_DEFAULT else "屏幕已恢复默认方向"
    print(status_msg)

if __name__ == "__main__":
    # 示例:把主屏幕顺时针转90度
    rotate_display(DMDO_90)
    # 如果要操作第二显示器,先查它的设备名,比如双屏通常是r"\\.\DISPLAY2",然后这么调用:
    # rotate_display(DMDO_90, device_name=r"\\.\DISPLAY2")

给你唠唠这个方案的细节:

  • 这是直接调用Windows的ChangeDisplaySettingsExW原生API,比任何第三方工具都靠谱,不会有兼容性问题
  • 不需要装额外的库,ctypes是Python自带的,直接就能用
  • 如果要操作第二显示器,得先知道它的设备名称。你可以用EnumDisplayDevicesAPI枚举所有显示器,或者简单点,双屏环境下第二屏一般是\\.\DISPLAY2,可以自己试试

另外提一嘴,如果你还是想用快捷键,去显卡控制面板(NVIDIA/AMD/Intel的都行)里找“显示旋转”的快捷键设置,开了之后Ctrl+Alt+方向键应该就能用了,但自动化的话还是上面的Python代码更顺手。

备注:内容来源于stack exchange,提问作者J_dev_J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 13:08:20