Come forzare l'aggiornamento o l'aggiornamento dello sfondo del desktop di Windows


17

Se cambio manualmente l'immagine di sfondo nel registro, come posso forzare l'aggiornamento senza disconnettersi?

So che bginfo lo fa, ma vorrei mantenere le cose semplici e non usare alcun software.

Risposte:


16
RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True

7
Questo non sembra funzionare in Win7 x64 ... qualcuno ha qualcosa che funziona per quello?
Jon Kloske,

3
RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, TrueUsarlo come sembra funzionare sulla mia macchina (notare la virgola mancante dietro UpdatePerUserSystemParameters)
Nebulosa

Può confermare, in realtà non aggiorna il desktop su Win7 x64. Ho provato a chiamare entrambe le versioni di RunDll per ogni evenienza.
Okuma.Scott,

3
  • Apri Task manager
  • Kill explorer.exe
  • Se la shell non si riavvia immediatamente
  • Dal menu selezionare File> Nuova attività
  • Digita "explorer.exe" e premi invio.

Buona idea, ma questo semplicemente non lo risolve.
Nathan Strutz,

2

Stavo cercando di fare qualcosa di simile: aggiornare un'impostazione del registro per il menu di avvio e quindi fare in modo che il menu di avvio rifletta le modifiche.

La soluzione di questa domanda MSDN ha funzionato perfettamente per me.

Potresti provare a trasmettere un WM_SETTINGCHANGEmessaggio. Per esempio:

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);
    }
}

1

Cambia la risoluzione dello schermo, quindi scegli l'opzione di ripristino. La tua risoluzione rimarrà la stessa e lo sfondo sarà cambiato.

In alternativa, scollegare e ricollegare il cavo dello schermo.


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

1
Questo sembra carino, ma perché tutte le cose del disco lì dentro?
not2qubit

0

La linea dalla risposta accettata ha funzionato per me molto sporadicamente. Ho finito per scrivere un ciclo while per chiamare il codice in silenzio in background 25 volte. Spero che sia di aiuto.

Codice dalla risposta accettata:

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True

Codice dalla parte superiore del mio script bash:

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 &
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.