python - Windows 中的多显示器设置的每个屏幕都有不同的墙纸

标签 python windows winapi desktop-wallpaper

我正在使用:

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

更换墙纸。

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

虽然此功能在 Windows 中不是标准功能,但有一些外部应用程序(如 ultramon)可以执行此操作。有人知道它是如何工作的吗?

如果我将两张图片合二为一然后将其设为墙纸,我认为它可能会起作用,但我仍然需要一种方法让一张图片横跨两个屏幕。

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

最佳答案

  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 屏幕截图,您就会明白我在结果中的意思。

关于python - Windows 中的多显示器设置的每个屏幕都有不同的墙纸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41397082/

相关文章:

python - 将 unicode 字符串转换为 float

python - Matplotlib 1.0.1 至 1.4.2

windows - 缺少安装 OpenCV HighGUI

python - 使python进程名称更明确

c++ - wxTaskBarIcon 右键单击​​事件不起作用

c++ - 将文件名从现有进程传递到新进程 MFC C++

windows - Windows 中如何生成短文件名?

python - Flask 使用 CORS 服务静态文件夹

python - Pandas Dataframe apply() 方法提供了一个行对象,但是如何访问索引值

c - 获取 minifilter 驱动中的文件路径