Windows多显示器设置中每个屏幕不同的壁纸
我正在使用:
ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER,
0, "picturefile", 0)
来更换桌面壁纸。
不过我在想,有没有简单的方法可以让每个屏幕显示不同的壁纸。
这个功能在Windows系统中并不是标准配置,但有一些外部应用程序,比如ultramon,可以实现这个功能。有人知道这是怎么做到的吗?
我想的办法是把两张图片合成一张,然后把这张合成的图片设为壁纸,但我还需要一种方法来让这张图片跨越两个屏幕。
另外,我还想知道怎么获取一些关于显示器设置的信息,比如每个屏幕的分辨率和它们的位置?就像在Windows的图形界面显示设置中看到的那样,但我想要的是数字形式的。
1 个回答
把多个图片合成一张大图后,你需要把壁纸模式设置为平铺,这样这张大图才能覆盖整个桌面(否则每个显示器上会重新开始显示)。
有几种方法可以做到这一点:
a) 使用IActiveDesktop(这并不需要使用Active Desktop,所以不用担心)。这种方法在Windows 7上效果最好,因为新的壁纸会渐渐显示出来。
你需要创建一个IActiveDesktop / CLSID_ActiveDesktop的COM对象,然后调用SetWallpaper、SetWallpaperOptions,最后调用ApplyChanges。(因为我不是Python开发者,所以不太清楚你怎么访问这个COM对象,抱歉。)
或者:
b) 通过注册表。这种方法没那么好,但也能正常工作。
在
HKEY_CURRENT_USER\Control Panel\Desktop
下设置:TileWallpaper
设置为 (REG_SZ)1
(也就是字符串"1",而不是数字1)WallpaperStyle
设置为 (REG_SZ)0
(也就是字符串"0",而不是数字0)- 然后像之前那样调用SystemParameterInfo(SPI_SETDESKTOPWALLPAPER...)。
顺便提一下,我看到的代码使用了IActiveDesktop,如果失败就退回到注册表,最后一个参数传给SystemParameterInfo的是
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE
; 而你现在传的是0,这可能不对。EnumDisplayMonitors是一个Win32 API,用于获取显示器的详细信息,包括它们的屏幕大小和相对位置。
这个API通过你提供的回调函数返回结果。(它会为每个显示器调用一次这个函数。)我不是Python开发者,所以不太清楚你怎么从Python调用这样的函数。
快速在网上搜索“Python EnumWindows”(EnumWindows是一个常用的API,以相同的方式返回结果)可以找到一些讨论,提到使用Lambda函数作为回调,所以看起来是可行的,但我就不多说了,留给更懂Python的人去处理。
注意:记得处理那些不紧挨着或不对齐的显示器。你合成的图片可能需要留出空白区域,以便在所有显示器上都能对齐。如果你移动其中一个显示器,然后按下PrtScn截图整个桌面,你会看到我说的意思。