3

我正在使用:

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

换壁纸。

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

虽然这个功能在 Windows 中不是标准的,但是有像 ultramon 这样的外部应用程序可以做到这一点。有谁知道它是如何工作的?

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

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

4

1 回答 1

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

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

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

    您创建一个 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 并在失败时回退到注册表,SPIF_UPDATEINIFILE | SPIF_SENDCHANGE作为 SystemParameterInfo 的最后一个参数传递;您当前正在传递 0 这可能是错误的。

  2. EnumDisplayMonitors是 Win32 API,用于获取有关监视器的详细信息,包括它们的屏幕尺寸和相对于彼此的位置。

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

    快速谷歌搜索“Python EnumWindows”(EnumWindows 是一种常用的 API,它以相同的方式返回结果)发现人们在谈论这个问题,并使用 Lambda 函数进行回调,所以它看起来是可能的,但我会离开给更了解 Python 的人。

    注意:请记住处理彼此不相邻或彼此不对齐的显示器。您编译的图像可能需要有空白区域才能使所有显示器上的内容正确排列。如果您移动其中一台显示器并对整个桌面进行 PrtScn 屏幕截图,您将在结果中看到我的意思。

于 2010-12-17T08:13:54.510 回答