如何修复 RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters 1, True 不是每次都更新

How to fix RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters 1, True not updating every time

我看过 this Whosebug 文章,同样的事情也适用于我。为什么 RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters 1, True 每次都不起作用?有没有其他方法可以让它工作而不是重复它直到它工作或者是否有某种方法可以对其进行编码以使其工作? .cmd , .bat.ps1 都可以)或者 best/only 的方法 运行 很多次所以它有效

现在我的解决方案是 运行 多次直到它起作用。有没有其他方法可以在不 运行ning RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters 1, True 很多次的情况下刷新桌面墙纸?

来自帮助 https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-systemparametersinfow

尽管这是来自 2001 年的文档并且已从当前文档中删除。

Setting pvParam to "" removes the wallpaper. Setting pvParam to VBNULL reverts to the default wallpaper.


REM ChangeWallpaper.bat
REM Compiles ChangeWallpaper.vb to ChangeWallpaper.exe
C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc "%~dp0\ChangeWallpaper.vb" /out:"%~dp0\ChangeWallpaper.exe" /target:winexe
pause

;ChangeWallpaper.vb
Imports System.Runtime.InteropServices

Public Module ChangeWallpaper
    Public Declare Unicode Function SystemParametersInfoW Lib "user32" (ByVal uAction As Integer, ByVal uParam As Integer, ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer
    Public Const SPI_SETDESKWALLPAPER = 20
    Public Const SPIF_SENDWININICHANGE = &H2
    Public Const SPIF_UPDATEINIFILE = &H1

Public Sub Main()    
    Dim Ret as Integer
    Dim FName As String
    Fname = "C:\Windows\Web\Wallpaper\Theme1\img1.jpg"
    'This below line which is commented out takes a filename on the command line
    'FName = Replace(Command(), """", "")

    Ret = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, FName, SPIF_SENDWININICHANGE + SPIF_UPDATEINIFILE)
    If Ret = 0 Then Msgbox(err.lastdllerror)
End Sub

End Module

代码来自这里https://winsourcecode.blogspot.com/2019/06/changewallpaper.html

更新

这是使用的问题

     Declare Function UpdatePerUserSystemParameters Lib "User32.dll" (ByVal i As Long, ByVal b As Boolean) As long

正如您从文章中看到的那样,Rundll32 正在为 j 传递一个 hwnd(可能是 0 表示 Desktop 是父级),并将 RunDll32 的 HInst 作为布尔值传递给 b,因为这将非零,它将被视为 true。