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

2023-01-09 14:52:01 +08:00
 biguokang

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

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

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

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

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

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

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

1316 次点击
所在节点    Windows
7 条回复
karatsuba
2023-01-09 14:59:02 +08:00
搞两个文件夹,一个用来轮播一个用来备份
biguokang
2023-01-09 15:10:08 +08:00
ps. 我以前在 mac 上是可以实现这个操作的,mac 设置里的壁纸轮播会递归遍历子文件夹里的每一个图片进行轮播,因为配了新电脑最近换 windows ,所以我才会有这个需求。
lisongeee
2023-01-09 16:14:55 +08:00
搞一个单独文件夹,然后写个脚本递归把原来文件夹的所有图片文件硬链接到这个新的文件夹
定时同步完毕之后,运行一下这个脚本
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
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
2023-01-09 20:03:20 +08:00
软链
runningowl
2023-01-10 06:51:07 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/907600

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX