V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
biguokang
V2EX  ›  Windows

请教一下关于 window 桌面壁纸轮播的问题

  •  
  •   biguokang · 2023-01-09 14:52:01 +08:00 · 1379 次点击
    这是一个创建于 689 天前的主题,其中的信息可能已经有所发展或是发生改变。

    win10 壁纸设置有一个幻灯片放映的选项(其实就是壁纸轮播),意思是你指定一个文件夹,那么你的 windows 壁纸是轮播该文件夹里面的图片。

    然后我的照片文件夹根目录是没有图片的,我照片文件夹里有几百张图片分别存在十几个子文件夹里。

    如果幻灯片相册直接设置我的照片文件夹,是不会有反应的,只有设置我照片文件夹里的某一个子文件夹,才会轮播我这个子文件夹里面的图片。

    所以看起来貌似是,这个 windows 设置里的壁纸轮播不支持递归子文件夹操作。

    我现在的需求是,如何让壁纸轮播递归每一个子文件夹里呢,我 google 了一下貌似 window 壁纸设置还真的不支持这种递归遍历操作。

    而且此外还有一个前提,那就是我电脑本地照片文件夹是定时从 nas 的照片文件夹那里同步下来的,我曾经想过写脚本在我的本地文件夹取消所有的子文件夹让里面的照片都存在照片文件夹根目录里,但是同步怎么办???

    请教下各位大佬,有没有啥方案能实现我的需求

    7 条回复    2023-01-10 06:51:07 +08:00
    karatsuba
        1
    karatsuba  
       2023-01-09 14:59:02 +08:00   ❤️ 2
    搞两个文件夹,一个用来轮播一个用来备份
    biguokang
        2
    biguokang  
    OP
       2023-01-09 15:10:08 +08:00
    ps. 我以前在 mac 上是可以实现这个操作的,mac 设置里的壁纸轮播会递归遍历子文件夹里的每一个图片进行轮播,因为配了新电脑最近换 windows ,所以我才会有这个需求。
    lisongeee
        3
    lisongeee  
       2023-01-09 16:14:55 +08:00
    搞一个单独文件夹,然后写个脚本递归把原来文件夹的所有图片文件硬链接到这个新的文件夹
    定时同步完毕之后,运行一下这个脚本
    loginv2
        4
    loginv2  
       2023-01-09 17:04:39 +08:00
    可以做一个换壁纸的程序 user32.dll 有一个 api SystemParametersInfo 。可以换壁纸,但是没法控制居中平铺之类的效果,需要修改注册表来实现
    还有另一个方案 https://www.cnblogs.com/lzjsky/archive/2011/01/17/1937514.html 这里有讲

    我的简单想法是,在磁盘上找一个固定位置,通过脚本递归遍历你的图片,然后 mlink 到那个固定位置,然后系统设置壁纸位置也改成那里就行了。
    darklights
        5
    darklights  
       2023-01-09 17:11:10 +08:00
    程序员嘛, 自己动手, 饿死罢就

    $setwallpapersrc = @"
    using System.Runtime.InteropServices;

    public class Wallpaper
    {
    public const int SetDesktopWallpaper = 20;
    public const int UpdateIniFile = 0x01;
    public const int SendWinIniChange = 0x02;
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
    public static void SetWallpaper(string path)
    {
    SystemParametersInfo(SetDesktopWallpaper, 0, path, UpdateIniFile | SendWinIniChange);
    }
    }
    "@
    Add-Type -TypeDefinition $setwallpapersrc

    cd $PSScriptRoot
    $nr = [uint](Get-Content ".nr" -ErrorAction Ignore)
    $ls = Get-ChildItem -r *.jpg,*.jpeg | ? Length -gt 100kb | Select-Object -First ($nr + 10) | % FullName
    if ($nr -ge $ls.Length) { $nr = 0 }
    [Wallpaper]::SetWallpaper($ls[$nr])
    Set-Content '.nr' ($nr + 1)

    用计划任务跑 pwsh -noni -nop -w hidden -f "C:\Path\To\Pictures\wallpaper.ps1"

    实际上还是会有个小黑窗一闪而过,
    受不了的话只能用其他语言改写, 性能还好点
    又或者用个 exe 包一下

    #include <string>
    #include <Windows.h>
    int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR lpCmdLine,
    _In_ int nCmdShow)
    {
    STARTUPINFO startup_info;
    ::memset(&startup_info, 0, sizeof(STARTUPINFO));
    startup_info.cb = sizeof(STARTUPINFO);
    std::wstring cmd = L"pwsh ";
    cmd += lpCmdLine;
    PROCESS_INFORMATION process_info;
    ::CreateProcessW(
    nullptr,
    cmd.data(),
    nullptr,
    nullptr,
    true,
    CREATE_NO_WINDOW,
    nullptr,
    nullptr,
    &startup_info,
    &process_info
    );
    return 0;
    }

    用计划任务跑 RunPwshNoWin -noni -nop -f "C:\Path\To\Pictures\wallpaper.ps1"
    NoOneNoBody
        6
    NoOneNoBody  
       2023-01-09 20:03:20 +08:00
    软链
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1374 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:39 · PVG 01:39 · LAX 09:39 · JFK 12:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.