Как исправить RUNDLL32.EXE user32.dll, UpdatePerUserSystemParameters 1, True не обновляется каждый раз - PullRequest
0 голосов
/ 10 июня 2019

Я посмотрел эту статью StackOverflow , и то же самое относится и ко мне. Почему RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters 1, True не работает каждый раз? Есть ли какой-то другой способ заставить его работать, а не повторять его до тех пор, пока он не заработает, или есть какой-то способ его кодирования, чтобы он работал? .cmd, .bat и .ps1 в порядке) Или лучший / единственный способ запустить его несколько раз, чтобы он работал

Сейчас мое решение - просто запустить это несколько раз, пока оно не заработает. Есть ли другой способ обновить обои рабочего стола, не запуская RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters 1, True много раз?

1 Ответ

0 голосов
/ 11 июня 2019

из справки 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 и HInst RunDll32 в качестве логического значения для b, и, поскольку это будет ненулевое значение, оно будет рассматривается как истина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...