Fay
2022 年9 月 29 日 14:35
1
每天默默收壁纸,现在桌面都是一分钟一换。
想要的功能其实就是Windows的壁纸+幻灯片切换。然而,Win11下切换自带的虚拟桌面后,有几率被系统自动重置壁纸设置为“图片”。基本每次开机都要手动设置,很烦。
总结下需求:
(1)能加载本地文件夹下的图片为壁纸。能不能加载子文件夹不重要。
(2)支持幻灯片式切换,1分钟1次。
(3)图片填充自适应。
(4)功能单纯一点就好,能少吃点资源就更好了。
已知Display Fusion能实现,但自带的任务栏增强我不想要,还关不掉……
求推荐!
import ctypes
import random
import time
import os
def findAllFile(path):
for root, dirnames, filenames in os.walk(path):
for filename in filenames:
if filename.endswith('.jpg') or filename.endswith('.png'):
fullname = os.path.join(root, filename)
yield fullname
def main():
path = "C:/Users/Aafus/Pictures"
file_list = []
for i in findAllFile(path=path):
file_list.append(i)
while True:
filename = random.choice(file_list)
ctypes.windll.user32.SystemParametersInfoW(20, 0, filename, 0)
print(f"当前壁纸为:{filename}")
time.sleep(60*2)
if __name__ == '__main__':
main()
用 Python 撸了一个,只实现了换壁纸,还有优化空间,如开机自启动自己去弄个任务计划之类的就行了。
上面的代码已知的问题:
1 个赞
想问一下,你电脑切换壁纸的时候,会卡顿吗?
python我以前自己也写过一个,不过性能并没有达到自己理想中的状态,也可能是我显卡不够强的问题。
后来的想法是自己写一个自动换背景的html,然后用lively wallpager调用。估计性能会好一些。
卡顿没什么感觉,我电脑一般,估计有卡顿也只会出现在才启动时更换壁纸才会有,后面即使是卡了也感觉不到啊,反正是图片又不是视频。
py的脚本
import win32api, win32con, win32gui
import glob
import random
import configparser
import io
import logging
import sys
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
logging.basicConfig(filename='log.log', level=logging.INFO, format=LOG_FORMAT, datefmt=DATE_FORMAT)
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8') #改变标准输出的默认编码
def get_config():
conf = configparser.ConfigParser()
conf.read('./config.ini',encoding="utf-8-sig")
# print(conf)
config = conf.items('config')
# print('初始化配置'+str(config))
logging.info('初始化配置'+str(config))
return config
def set_wallpaper(img_path):
# 打开指定注册表路径
reg_key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, win32con.KEY_SET_VALUE)
# 最后的参数:2拉伸,0居中,6适应,10填充,0平铺
win32api.RegSetValueEx(reg_key, "WallpaperStyle", 0, win32con.REG_SZ, "10")
# 最后的参数:1表示平铺,拉伸居中等都是0
win32api.RegSetValueEx(reg_key, "TileWallpaper", 0, win32con.REG_SZ, "0")
# 刷新桌面
win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, img_path, win32con.SPIF_SENDWININICHANGE)
# win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER,img_path, 1+2)
if __name__ == "__main__":
config=get_config()
files=glob.glob(config[0][1]+'*')
# print(files)
# print(len(files))
file = random.sample(files, 1)
# print(file)
set_wallpaper(file[0])
# set_wallpaper("E:\\OneDrive\\图片\\PC壁纸\\105823-105.jpg")
同路径写一个config.ini配置文件,路径修改成自己的
[config]
path=D:\OneDrive\图片\PC壁纸\
最后可以考虑编译成exe,任务计划设置定时运行就好
这个不太清楚毕竟 Python,不同的电脑配置也不太一样,我用的笔记本开着脚本玩lol没觉得卡顿。也可以改用其他的语言写一下。
foyax
(foyax)
2022 年9 月 29 日 15:27
8
应该没那么合适的吧,最好还是自己写。
上面用SystemParametersInfoW的方法也不好,图片会经过多个步骤的转换。
自己写的话,在桌面UI下创建子分层窗口,读取图片直接贴上去就行,这也是那种将视频作为壁纸所用的方法
也没必要一分钟一换,有窗口监视工具的话,设置个当桌面显示时触发的定时器
其实什么语言关系不大,因为都是调用win32api。
win32api换壁纸,也有那么一瞬间explorer的资源占用会变高。如果开着游戏,电脑空闲资源不够就会顿卡。
Fay
2022 年9 月 29 日 21:51
10
关掉Aero透明和任务栏自动配色就好了,我以前也有同样的问题
dms
(稻米鼠)
2022 年9 月 29 日 21:52
11
我用壁纸引擎,资源占用可以接受,自己写个网页想怎么换怎么换,我现在是 15 分钟一张网络随机图片
Aero关了就太丑了。现在考虑的方案是用核显完成这个事情,独显就专心处理游戏。不过设置explorer、dwm使用核显,好像没生效。在切换壁纸的瞬间,还是用了独显渲染壁纸和areo的效果
loli
2022 年9 月 30 日 02:34
16
换壁纸怎么可能不"卡"呢.用啥也得卡呀,就算图片格式是bmp也有个加载过程
更别说其他的还要经过转换到bmp的过程
就算图片浏览器打开也得有这个过程呀.
自用的一个折腾很久了
最开始是以共享做这种事的
图片,视频都弄了
连多语言都弄了
可惜最开始选择了ahk做这件事,偶发的bug以及GUI性能都不理想最终还是自用了
就切换壁纸卡顿这种事我这的解决办法是提供了一个选项"仅在桌面时切换"
配合较短的间隔"10秒"
正常使用每次切换到桌面都会是新壁纸…
就图中这6w多张图片仅第一次加载就需要10-30分钟…
最开始是想过滤不适合的长图,后面很多功能依赖于这个就更加积重难返了
考虑改个壁纸使用本地源吗,随机本地的壁纸。在线的图片多少有些问题,要么是尺寸不够,要么是压缩率太高,要么文件太多瞬间占用带宽太多。
loli
2022 年9 月 30 日 02:56
20
空间换时间…
我用这套路熟悉…
但真不行…
我的图片浏览器仅仅加载到50+张图片内存就2-3G了…
还是让它在切换时"卡"一下吧
其实加载其他格式到bmp真没那么"卡"
我猜更多的性能是用在界面重绘上去了…
就像他说的开启aero时会更明显.
还是像我说的那样,切换到桌面时再切换壁纸吧
会有延时,但往好了说是一秒钟看两张图片
也不会在打游戏时切换了