求一个本地壁纸加载软件

每天默默收壁纸,现在桌面都是一分钟一换。
想要的功能其实就是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 Like

想问一下,你电脑切换壁纸的时候,会卡顿吗?

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没觉得卡顿。也可以改用其他的语言写一下。

应该没那么合适的吧,最好还是自己写。
上面用SystemParametersInfoW的方法也不好,图片会经过多个步骤的转换。
自己写的话,在桌面UI下创建子分层窗口,读取图片直接贴上去就行,这也是那种将视频作为壁纸所用的方法
也没必要一分钟一换,有窗口监视工具的话,设置个当桌面显示时触发的定时器

其实什么语言关系不大,因为都是调用win32api。

win32api换壁纸,也有那么一瞬间explorer的资源占用会变高。如果开着游戏,电脑空闲资源不够就会顿卡。

关掉Aero透明和任务栏自动配色就好了,我以前也有同样的问题

我用壁纸引擎,资源占用可以接受,自己写个网页想怎么换怎么换,我现在是 15 分钟一张网络随机图片

dual-monitor-tools

下面是我汉化编译的开源版本.

https://xkonglong.com/dual-monitor-tools/

Aero关了就太丑了。现在考虑的方案是用核显完成这个事情,独显就专心处理游戏。不过设置explorer、dwm使用核显,好像没生效。在切换壁纸的瞬间,还是用了独显渲染壁纸和areo的效果

:blush:网页有现成的吗

换壁纸怎么可能不"卡"呢.用啥也得卡呀,就算图片格式是bmp也有个加载过程
更别说其他的还要经过转换到bmp的过程
就算图片浏览器打开也得有这个过程呀.

自用的一个折腾很久了
最开始是以共享做这种事的
图片,视频都弄了
连多语言都弄了
可惜最开始选择了ahk做这件事,偶发的bug以及GUI性能都不理想最终还是自用了

就切换壁纸卡顿这种事我这的解决办法是提供了一个选项"仅在桌面时切换"
配合较短的间隔"10秒"
正常使用每次切换到桌面都会是新壁纸…

就图中这6w多张图片仅第一次加载就需要10-30分钟…
最开始是想过滤不适合的长图,后面很多功能依赖于这个就更加积重难返了

考虑改个壁纸使用本地源吗,随机本地的壁纸。在线的图片多少有些问题,要么是尺寸不够,要么是压缩率太高,要么文件太多瞬间占用带宽太多。

本地多简单啊,规律命名,随机数拼接图片地址……

可以的,先把图片加载完再换上去就行了。

空间换时间…
我用这套路熟悉…

但真不行…
我的图片浏览器仅仅加载到50+张图片内存就2-3G了…
还是让它在切换时"卡"一下吧
其实加载其他格式到bmp真没那么"卡"
我猜更多的性能是用在界面重绘上去了…
就像他说的开启aero时会更明显.

还是像我说的那样,切换到桌面时再切换壁纸吧
会有延时,但往好了说是一秒钟看两张图片
也不会在打游戏时切换了