Windows 下自动编辑桌面壁纸

我想要写一个程序，每天给桌面壁纸添加一张 xkcd 的漫画。于是我做了以下一系列事情，成功实现了功能。

编写 Python 脚本

使用爬虫获取 xkcd 漫画

xkcd 网站的结构比较简单，只需要在 HTML 中找出 comic 图像链接即可。使用代码如下：

Copy
url = 'https://xkcd.com/'

try:
# 使用 requests 库获取网页
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding

# 使用 bs4.BeautifulSoup 解析 HTML
soup = BeautifulSoup(r.text, 'lxml')
imgs = soup.find_all('img')

# 在各个图片链接中找到 xkcd 漫画链接
for i in imgs:
src = str(i.get('src'))
if '/comics/' in src:
if src.startswith('//'):
src = 'https:' + src

# 获取并保存漫画图片
imgfile = requests.get(src)
imgfile.raise_for_status()
with open('./resources/xkcd.jpg', 'wb') as f:
f.write(imgfile.content)
f.close()
print('Get xkcd image success')
break
else:
raise Exception(f'No comic found in {url}')

# 出现异常时保存异常信息
except Exception as e:
print('Get xkcd image fail')
with open(f'crash.log', 'a') as f:
# current_date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f'[{current_date}]:', e, file=f)
f.close()

使用 PIL 图像处理库编辑壁纸

也可以用其他的图像处理库，如 OpenCV。

Copy
# Open background
wallpaper = Image.open('./resources/background.jpg')

# Open xkcd image
xkcd = Image.open('./resources/xkcd.jpg')
wallpaper_xkcd = xkcd.resize((2 * xkcd.width, 2 * xkcd.height)).convert('RGB')
# 我这里设置将 xkcd 漫画放到壁纸右上角
wallpaper.paste(wallpaper_xkcd, box=(wallpaper.width * 15 // 16 - wallpaper_xkcd.width, wallpaper.height // 16))

# Save to wallpaper
with open('./wallpaper.jpg', 'wb') as f:
wallpaper.save(f)
f.close()

使用 Windows API 更换壁纸

要找到需要的 Windows API 对我来说是一件困难的事情，我这里求助了文心一言。也可以用 ChatGPT。

Copy
win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, os.path.join(script_path, 'wallpaper.jpg'))

预览效果如下图，可以看到壁纸右上角添加了一张 xkcd 漫画。

将脚本添加到 Windows 任务

程序设置完成后，要想定时执行，还需要添加到 Windows 任务。
使用 Windows 的搜索功能（快捷键：Windows+Q）找到 “任务计划程序”。点击右侧 “操作” 中的 “创建任务” 进行设置。具体设置方法见参考资料中的 “windows 定时运行 exe 文件”。

设置触发器

一定要设置触发器，否则任务不知道应该在什么时间执行。我设置为每天 23:00 执行。

设置操作时的参数

程序或脚本：如果你的系统安装了 python，“程序或脚本” 一栏可以写 python，也可以写 python.exe 的路径。

添加参数：“添加参数” 只需要写脚本的路径。（实际上可以都写到 “程序或脚本” 一栏，系统会自动划分参数）

起始于：一定要写，否则程序可能不会正确执行。这个参数设置为脚本的路径。

这样就实现了 Windows 下自动编辑桌面壁纸。

参考资料

Windows 10 壁纸：如何找到 win10 系统当前使用的壁纸位置（这个方法不是通过 Windows API 实现，已弃用）

设置任务：windows 定时运行 exe 文件

执行任务时报错：WIN10 设置计划任务执行报（0x1）调用的函数不正确或调用了未知函数

文心一言：文心一言