【问题标题】:different wallpaper for each screen for multi-monitor setups in WindowsWindows 中的多显示器设置的每个屏幕都有不同的壁纸
【发布时间】:2011-05-26 22:09:56
【问题描述】:

我正在使用:

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

更换壁纸。

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

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

我认为如果我将两张图片合并为一张然后将其作为壁纸可能会起作用,但我仍然需要一种方法将一张图片跨越两个屏幕。

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

【问题讨论】:

  • 不知道你的答案,但 AFAIK 你在正确的轨道上。我尝试了一些这样做的第三方应用程序,我隐约记得其中至少有一个解释说他们从窗口中获取了显示尺寸和相对位置,并将两个图像拼接在一起以在两个显示器上显示。我不记得我在哪个地方读过它,但如果我再次遇到它并记得,我会留下另一个评论。
  • 谢谢。如果你能找到它会很棒。

标签: python windows winapi desktop-wallpaper


【解决方案1】:
  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 屏幕截图,您会在结果中看到我的意思。

【讨论】:

  • 谢谢。现在我知道从哪里开始寻找了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2014-05-10
相关资源
最近更新 更多