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

Ste*_*son 2 python windows winapi desktop-wallpaper

我正在使用:

ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER,
                                           0, "picturefile", 0)
Run Code Online (Sandbox Code Playgroud)

要改变壁纸.

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

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

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

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

Leo*_*son 6

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

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

    a)使用IActiveDesktop(它要求活动桌面使用,不用担心).这是最好的,因为在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屏幕截图,您将看到我在结果中的含义.