使用Python持续更改Windows桌面壁纸

3

我使用这篇文章中提供的解决方案来从Python更改Windows桌面壁纸。

以下是代码示例:

import ctypes
import os
image_file = "myimage.jpg"
print("Setting the wallpaper")
SPI_SETDESKWALLPAPER = 20 
ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0,  os.path.abspath(image_file) , 0)

问题在于更改不是持久性的,也就是说每次我重启电脑时桌面壁纸都会重置。如何使用Python持久性地更改Windows桌面壁纸?
我使用的是 Python 3.5。

1
这不是您的直接问题,但请使用user32 = ctypes.WinDLL('user32', use_last_error=True)代替ctypes.windll.user32。检查成功与否,如果失败则抛出ctypes.WinError(ctypes.get_last_error())异常,以便调用方可以处理异常,而不是盲目地假装一切都很好。 - Eryk Sun
关于这个问题,你应该能够在几秒钟内通过阅读 SystemParametersInfofWinIni 参数文档来解决它。 - Eryk Sun
@eryksun 你说得对,但是我在哪里可以找到 SPIF_UPDATEINIFILE 的值呢?文档(https://msdn.microsoft.com/en-us/library/ms724947)没有提供它,只提供了 SPI_SETDESKWALLPAPER 的值。 在 winuser.h 中,它被定义为等于 1。 我们可以假定这个值在未来版本中永远不会改变吗,即使它没有在文档中指定? - robertspierre
是的,如果您有它们,请始终使用Windows头文件中的常量、函数声明和结构定义。在线文档是一个起点,但它们在某些细节上经常是错误的。 - Eryk Sun
1个回答

1
你需要这样调用它。
print("Setting the wallpaper")
SPI_SETDESKWALLPAPER = 20 
SPIF_UPDATEINIFILE = 1
ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, os.path.abspath(image_file) , SPIF_UPDATEINIFILE)

请查看相关的文档


即使文件不存在或是一个目录,这个特定的操作也会成功,所以您可能需要先检查 os.path.isfile(image_file) - Eryk Sun
通常来说,使用user32 = ctypes.WinDLL('user32', use_last_error=True)仍然是更好的选择。将全局的windll添加到ctypes中是一个糟糕的想法,原因有很多,第一个原因是共享全局状态几乎总是会出现问题。 - Eryk Sun
@eryksun,关于您的第一条评论,这真的很奇怪,因为文档说:“当使用SPI_SETDESKWALLPAPER标志时,SystemParametersInfo返回TRUE,除非出现错误(例如指定的文件不存在)。”。我没有测试过,但如果是这样的话,那就意味着ctypes库没有正确处理返回值。 - robertspierre
ctypes在这里很好用。正如我所说,MSDN经常是错误的(例如,结构体中的错误值、错误类型和字段以及行为描述不准确)。文档并非由开发人员编写,它们经常过时或反映了应该实现但实际上从未实现的内容。 - Eryk Sun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接