win10 一键切换壁纸脚本问题

2023-10-21 19:49:10 +08:00
 sleepingdog
我一般设置自动幻灯片显示不正经的壁纸,但某些时候需要马上显示正经的,于是就问了 chatgpt ,它给了我这个 bat 脚本

REG ADD "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d "C:\Users\×××.jpg" /f
RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters

我试了下发现有时候可以执行成功有时候却不行,比较神奇。(指向该 bat 脚本的快捷方式已经加了管理员权限)
仔细研究才发现——
直接双击执行————不能切换壁纸
直接右键管理员运行————也不能
但当我先点一下桌面,再双击的时候,就切换成功了。这是什么神奇的安全机制?还是 bug ?


( wallpaper engine 我也知道有快捷键,不过暂时不折腾这个了。还是直接用 win 自带的+脚本,目前够用)
( win10ltsc 。放弃了 win11 了,重装 win10 ,感觉也没想象中麻烦)
641 次点击
所在节点    Windows
2 条回复
cnbatch
2023-10-22 15:06:32 +08:00
注册表只是个信息储存库,把内容写进去以后,并不表示应用与系统会立即重新读取,甚至可以下次启动时再读取。所以使用注册表换壁纸有时间差很正常。

想换壁纸且立即生效的话,要用 Windows API:
https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-idesktopwallpaper-setwallpaper

这个 API 是 Win8 开始提供的,以往的 Windows 只能用注册表的方式来设置,所以 ChatGPT 不会第一时间就提供这个做法。
要这样问 ChatGPT:“我想用 IDesktopWallpaper::SetWallpaper 这个 API 设置壁纸,并且使用 vbscript ,请问可以提供一个吗?”
我问过后,它确实能够写出一段使用 IDesktopWallpaper::SetWallpaper 的 vbscript 代码。

要不自己用 C++写个 exe 调用 API 吧。这样还可以顺便调用 WinRT 的 winrt::Windows::System::UserProfile::LockScreen::SetImageFileAsync() 设置锁屏壁纸。
sleepingdog
2023-10-22 18:30:27 +08:00
#1 thanks~

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

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

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

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

© 2021 V2EX