Windows多显示器设置中每个屏幕不同的壁纸

3 投票
1 回答
3293 浏览
提问于 2025-04-16 08:39

我正在使用:

ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER,
                                           0, "picturefile", 0)

来更换桌面壁纸。

不过我在想,有没有简单的方法可以让每个屏幕显示不同的壁纸。

这个功能在Windows系统中并不是标准配置,但有一些外部应用程序,比如ultramon,可以实现这个功能。有人知道这是怎么做到的吗?

我想的办法是把两张图片合成一张,然后把这张合成的图片设为壁纸,但我还需要一种方法来让这张图片跨越两个屏幕。

另外,我还想知道怎么获取一些关于显示器设置的信息,比如每个屏幕的分辨率和它们的位置?就像在Windows的图形界面显示设置中看到的那样,但我想要的是数字形式的。

1 个回答

7
  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,这可能不对。

  2. EnumDisplayMonitors是一个Win32 API,用于获取显示器的详细信息,包括它们的屏幕大小和相对位置。

    这个API通过你提供的回调函数返回结果。(它会为每个显示器调用一次这个函数。)我不是Python开发者,所以不太清楚你怎么从Python调用这样的函数。

    快速在网上搜索“Python EnumWindows”(EnumWindows是一个常用的API,以相同的方式返回结果)可以找到一些讨论,提到使用Lambda函数作为回调,所以看起来是可行的,但我就不多说了,留给更懂Python的人去处理。

    注意:记得处理那些不紧挨着或不对齐的显示器。你合成的图片可能需要留出空白区域,以便在所有显示器上都能对齐。如果你移动其中一个显示器,然后按下PrtScn截图整个桌面,你会看到我说的意思。

撰写回答