【问题标题】:Persistently change Windows desktop wallpaper using python使用 python 持久更改 Windows 桌面壁纸
【发布时间】:2017-06-07 06:42:58
【问题描述】:

我使用this帖子中提供的解决方案从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)

问题在于更改是非持久性的,因为每当我重新启动 PC 时桌面壁纸都会重置。如何通过 Python 持久更改 Windows 桌面壁纸?

我使用 python 3.5

【问题讨论】:

  • 这不是您的直接问题,但请使用user32 = ctypes.WinDLL('user32', use_last_error=True) 而不是ctypes.windll.user32。检查是否成功,如果不是raise ctypes.WinError(ctypes.get_last_error()),以便调用者可以处理异常,而不是盲目地假装一切正常。
  • 至于眼前的问题,您应该能够通过阅读SystemParametersInfofWinIni 参数的文档在几秒钟内解决这个问题。
  • @eryksun 你是对的,但我在哪里可以找到 SPIF_UPDATEINIFILE 的值?文档 (msdn.microsoft.com/en-us/library/ms724947) 没有提供它,但它提供了 SPI_SETDESKWALLPAPER 的值。在winuser.h 中,它被定义为等于 1。假设这个值在未来的版本中永远不会改变,尽管它没有在文档中指定,这是否正确?
  • 是的,如果有的话,请始终使用 Windows 标头中的常量、函数声明和结构定义。在线文档是一个起点,但它们在某些细节上往往是错误的。

标签: python windows python-3.x ctypes wallpaper


【解决方案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)

也可以看看相关的documentation

【讨论】:

  • 即使文件不存在或者是目录,此特定操作也会成功,因此您可能需要事先检查os.path.isfile(image_file)
  • 一般来说使用user32 = ctypes.WinDLL('user32', use_last_error=True) 会更好。将全局 windll 添加到 ctypes 是一个坏主意,原因有几个,首先是共享全局状态几乎总是等待的问题。
  • @eryksun 关于您的第一条评论,这真的很奇怪,因为文档说“当使用 SPI_SETDESKWALLPAPER 标志时,SystemParametersInfo 返回 TRUE,除非出现错误(例如当指定的文件没有存在)。”。我没有测试它,但如果是这样的话,那意味着ctypes 库没有正确处理返回值
  • ctypes 在这里很好。正如我所说,MSDN 经常是错误的(例如错误的值、结构中错误的类型和字段,以及对行为的不准确描述)。这些文档不是由开发人员编写的,它们通常是陈旧的或反映了应该实施的内容,而没有人真正解决过它。
猜你喜欢
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多