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

win10 一键切换壁纸脚本问题

  •  
  •   sleepingdog · 204 天前 · 504 次点击
    这是一个创建于 204 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我一般设置自动幻灯片显示不正经的壁纸,但某些时候需要马上显示正经的,于是就问了 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 ,感觉也没想象中麻烦)
    2 条回复    2023-10-22 18:30:27 +08:00
    cnbatch
        1
    cnbatch  
       203 天前   ❤️ 1
    注册表只是个信息储存库,把内容写进去以后,并不表示应用与系统会立即重新读取,甚至可以下次启动时再读取。所以使用注册表换壁纸有时间差很正常。

    想换壁纸且立即生效的话,要用 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
        2
    sleepingdog  
    OP
       203 天前
    #1 thanks~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1000 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:29 · PVG 03:29 · LAX 12:29 · JFK 15:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.