【发布时间】:2016-03-05 12:47:59
【问题描述】:
我正在尝试编写一个 python 脚本来切换主监视器。 我有 3 台显示器(一台插入 i5 的图形芯片,两台插入 ATI HD7870)
我写了以下脚本:
import win32api as w
import win32con as c
i = 0
workingDevices = []
def setPrimary(id):
global workingDevices
return w.ChangeDisplaySettingsEx(
workingDevices[id].DeviceName,
w.EnumDisplaySettings(
workingDevices[id].DeviceName,
c.ENUM_CURRENT_SETTINGS
),
c.CDS_SET_PRIMARY | c.CDS_UPDATEREGISTRY | c.CDS_RESET) \
== c.DISP_CHANGE_SUCCESSFUL
while True:
try:
Device = w.EnumDisplayDevices(None, i, 1)
if Device.StateFlags & c.DISPLAY_DEVICE_ATTACHED_TO_DESKTOP: #Attached to desktop
workingDevices.append(Device)
i += 1
except:
break
print("Num Devices: ", len(workingDevices))
for dev in workingDevices:
print("Name: ", dev.DeviceName)
调用它会导致:
In [192]: %run test.py
Num Devices: 3
Name: \\.\DISPLAY1
Name: \\.\DISPLAY2
Name: \\.\DISPLAY7
In [193]: setPrimary(0)
Out[193]: True
In [194]: setPrimary(1)
Out[194]: True
In [195]: setPrimary(2)
Out[195]: True
到目前为止,它看起来不错,但问题是:没有任何变化。由于 CDS_RESET,我的显示器很快闪烁,但主屏幕没有改变,尽管 ChangeDisplaySettingsEx 返回 DISP_CHANGE_SUCCESSFUL
有人知道为什么吗? (我使用 Python 3.5.1 和 PyWin32 build 220)
PS 我使用 1 作为 EnumDisplayDevices 的第三个参数,因为 msdn 声明它应该设置为 1,尽管 PyWin 帮助说它应该设置为 0。 但是脚本的行为不会独立于这个值是一或零而改变
【问题讨论】:
标签: python-3.x winapi pywin32