So erzwingen Sie, dass der Windows-Desktophintergrund aktualisiert oder aktualisiert wird

17

Wie kann ich das Aktualisieren des Hintergrundbilds in der Registrierung erzwingen, ohne es abzumelden?

Ich weiß, dass bginfo das macht, aber ich möchte die Dinge einfach halten und keine Software verwenden.

RASG
quelle

Antworten:

16
RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True
Matthewk
quelle
7
Dies scheint in win7 x64 nicht zu funktionieren ... hat jemand etwas, das dafür funktioniert?
Jon Kloske
3
Die Verwendung so, wie RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, Truees auf meinem Computer zu funktionieren scheint (beachten Sie das fehlende Komma hinter UpdatePerUserSystemParameters)
Nebula
Kann bestätigen, aktualisiert den Desktop unter Win7 x64 nicht. Versucht, beide Versionen von RunDll für alle Fälle aufzurufen.
Okuma.Scott
3
  • Öffnen Sie den Task-Manager
  • Töte explorer.exe
  • Wenn die Shell nicht sofort neu gestartet wird
  • Wählen Sie im Menü Datei> Neue Aufgabe
  • Geben Sie "explorer.exe" ein und drücken Sie die Eingabetaste.
SecurityMatt
quelle
Guter Gedanke, aber das löst es einfach nicht.
Nathan Strutz
2

Ich habe versucht, etwas Ähnliches zu tun - eine Registrierungseinstellung für das Startmenü zu aktualisieren und dann sofort das Startmenü die Änderungen wiedergeben zu lassen.

Die Lösung dieser MSDN-Frage hat bei mir perfekt funktioniert.

Sie können versuchen, eine WM_SETTINGCHANGENachricht zu senden . Zum Beispiel:

class Program
{
    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr SendMessageTimeout(IntPtr hWnd, int Msg, IntPtr wParam, string lParam, uint fuFlags, uint uTimeout, IntPtr lpdwResult);

    private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff);
    private const int WM_SETTINGCHANGE = 0x1a;
    private const int SMTO_ABORTIFHUNG = 0x0002;

    static void Main(string[] args)
    {
        SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, null, SMTO_ABORTIFHUNG, 100, IntPtr.Zero);
    }
}
mcw
quelle
1

Ändern Sie die Bildschirmauflösung und wählen Sie dann die Option zum Zurücksetzen. Ihre Auflösung bleibt gleich und der Hintergrund hat sich geändert.

Alternativ können Sie das Anzeigekabel abklemmen und wieder anschließen.

Dan
quelle
1
# first in powershell, second both. cmd.exe + powershell.exe

# Refresh Desktop Ability
$definition = @'
    [System.Runtime.InteropServices.DllImport("Shell32.dll")] 
    private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
    public static void Refresh() {
        SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);    
    }
'@
Add-Type -MemberDefinition $definition -Namespace WinAPI -Name Explorer

# Set Safe within deleted days and get physical drive letters
$ignoreDeletedWithinDays = 2
$drives = (gwmi -Class Win32_LogicalDisk | ? {$_.drivetype -eq 3}).deviceid

# Process discovered drives
$drives | % {$drive = $_
    gci -Path ($drive+'\$Recycle.Bin\*\$I*') -Recurse -Force | ? {($_.LastWriteTime -lt [datetime]::Now.AddDays(-$ignoreDeletedWithinDays)) -and ($_.name -like "`$*.*")} | % {

        # Just a few calcs
        $infoFile         = $_
        $originalFile     = gi ($drive+"\`$Recycle.Bin\*\`$R$($infoFile.Name.Substring(2))") -Force
        $originalLocation = [regex]::match([string](gc $infoFile.FullName -Force -Encoding Unicode),($drive+'[^<>:"/|?*]+\.[\w\-_\+]+')).Value
        $deletedDate      = $infoFile.LastWriteTime
        $sid              = $infoFile.FullName.split('\') | ? {$_ -like "S-1-5*"}
        $user             = try{(gpv "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\$($sid)" -Name ProfileImagePath).replace("$(gpv 'HKLM:\Software\Microsoft\Windows NT\CurrentVersion\ProfileList' -Name ProfilesDirectory)\",'')}catch{$Sid}

        #' Various info
        $originalLocation
        $deletedDate
        $user
        $sid
        $infoFile.Fullname
        ((gi $infoFile -force).length / 1mb).ToString('0.00MB')
        $originalFile.fullname
        ((gi $originalFile -force).length / 1mb).ToString('0.00MB')
        ""

        # Blow it all Away
        #ri $InfoFile -Recurse -Force -Confirm:$false -WhatIf
        #ri $OriginalFile -Recurse -Force -Confirm:$false- WhatIf
        # remove comment before two lines above and the '-WhatIf' statement to delete files
    }
}

# Refresh desktop icons
[WinAPI.Explorer]::Refresh()

or 

ie4uinit.exe -ClearIconCache

end scripting enjoy.
#end
Test Test
quelle
1
Das sieht gut aus, aber warum all die Drive- Sachen da drin?
not2qubit
0

Die Zeile aus der akzeptierten Antwort funktionierte für mich sehr sporadisch. Am Ende schrieb ich eine while-Schleife, um den Code 25 Mal still im Hintergrund aufzurufen. Hoffe das hilft.

Code aus der akzeptierten Antwort:

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True

Code von oben in meinem Bash-Skript:

desktop () {

i=0

# Tell the desktop to refresh 25 times.
while [ $i -le 25 ]
do
  echo "RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters, 1 True"| "C:/Windows/System32/WindowsPowerShell/v1.0/powershell"
  ((i++))
done

}


# This runs the function silently as a background process
desktop &>/dev/null &
WarTurtle
quelle