1

我看过这篇 StackOverflow文章,同样的事情也适用于我。为什么RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters 1, True每次都不起作用?有没有其他方法可以让它工作而不是重复它直到它工作,或者有什么方法可以对其进行编码以便它工作?.cmd.bat并且.ps1很好)或者是最好/唯一的方法来运行它很多次,以便它工作

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

4

1 回答 1

2

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

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

将 pvParam 设置为 "" 会删除壁纸。将 pvParam 设置为 VBNULL 将恢复为默认壁纸。


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 正在传递一个 hwnd(可能是 0 表示 Desktop 是父级)j和 RunDll32 的 HInst 作为布尔值b,并且由于这将是非零,因此将被视为真。

于 2019-06-11T03:00:53.453 回答