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

时间:2010-12-17 03:09:09

标签: python windows winapi desktop-wallpaper

我正在使用:

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

更改壁纸。

但我想知道是否有任何简单的方法可以在每个屏幕上放置不同的壁纸。

此功能在Windows中不是标准功能,但有像ultramon这样的外部应用程序可以执行此操作。有谁知道它是如何工作的?

如果我将这两个图像合并为一个然后制作壁纸,我认为它可能会起作用的方式,但是我仍然需要一种跨两个屏幕跨越一个图像的方法。

另外,我如何获取有关显示器设置,每个屏幕的分辨率及其位置的一些信息?就像你在windows中的gui显示设置中看到的那样,但是在数字中。

1 个答案:

答案 0 :(得分:6)

  1. 将图像合并为一个大图像后,您必须将壁纸模式设置为平铺以使图像跨越桌面(否则它将在每个显示器上重新启动)

    有几种方法可以做到这一点:

    a)使用IActiveDesktop要求使用Active Desktop,请不要担心)。这是最好的,因为在Win7上新壁纸将会淡入。

    您创建一个IActiveDesktop / CLSID_ActiveDesktop COM对象,然后调用SetWallpaper,SetWallpaperOptions,最后调用ApplyChanges。 (因为我不是Python开发人员,我不确定你是如何访问COM对象的,抱歉。)

    OR:

    b)通过注册表。这不是很好,但效果还不错。

    HKEY_CURRENT_USER\Control Panel\Desktop设置下:

    • TileWallpaper至(REG_SZ)1(即字符串“1”不是数字1)
    • WallpaperStyle到(REG_SZ)0(即字符串“0”不是数字0)
    • 然后像你一样调用SystemParameterInfo(SPI_SETDESKTOPWALLPAPER ...)。

    顺便说一句,我正在查看的代码,它使用IActiveDesktop并在注册表失败时返回注册表,将SPIF_UPDATEINIFILE | SPIF_SENDCHANGE作为最后一个参数传递给SystemParameterInfo;你目前正在通过0这可能是错误的。

  2. EnumDisplayMonitors是用于获取监视器详细信息的Win32 API,包括屏幕大小和相对位置。

    该API通过您必须提供的回调函数返回其结果。 (它为每个监视器调用一次。)我不是Python开发人员所以我不确定如何从Python调用这样的函数。

    用于“Python EnumWindows”的快速Google(EnumWindows是一种常用的API,以相同的方式返回结果)发现人们在谈论这一点,并使用Lambda函数进行回调,所以它看起来有可能但我将它留给了解更多Python的人。

    注意:请务必应对彼此不相邻或彼此不对齐的显示器。您编译的图像可能需要有空白区域才能使所有监视器上的内容对齐。如果您移动其中一个显示器并执行整个桌面的PrtScn屏幕截图,您将看到我在结果中的含义。