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
相关产品推荐
相关产品推荐

