Cómo forzar que el fondo del escritorio de Windows se actualice o actualice


17

Si cambio manualmente la imagen de fondo en el registro, ¿cómo puedo forzar que se actualice sin cerrar sesión?

Sé que bginfo lo hace, pero me gustaría mantener las cosas simples y no usar ningún software.

Respuestas:


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

77
Esto no parece funcionar en win7 x64 ... ¿alguien tiene algo que funcione para eso?
Jon Kloske

3
Usarlo como RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, Trueparece funcionar en mi máquina (tenga en cuenta la coma que falta detrás de UpdatePerUserSystemParameters)
Nebula

Puede confirmar, en realidad no actualiza el escritorio en Win7 x64. Intenté llamar a ambas versiones de RunDll por si acaso.
Okuma.Scott

3
  • Administrador de tareas abierto
  • Matar explorer.exe
  • Si el shell no se reinicia de inmediato
  • En el menú, seleccione Archivo> Nueva tarea
  • Escribe "explorer.exe" y presiona enter.

Bien pensado, pero eso simplemente no lo resuelve.
Nathan Strutz

2

Estaba tratando de hacer algo similar: actualizar una configuración de registro para el menú de inicio e inmediatamente hacer que el menú de inicio refleje los cambios.

La solución de esta pregunta de MSDN me funcionó perfectamente.

Podrías intentar transmitir un WM_SETTINGCHANGEmensaje. Por ejemplo:

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

Cambie la resolución de la pantalla, luego elija la opción de revertir. Su resolución seguirá siendo la misma y el fondo habrá cambiado.

Alternativamente, desconecte y vuelva a conectar el cable de la pantalla.


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
Esto se ve bien, pero ¿por qué todas las cosas de disco allí?
not2qubit

0

La línea de la respuesta aceptada me funcionó muy esporádicamente. Terminé escribiendo un bucle while para llamar el código en silencio en el fondo 25 veces. Espero que esto ayude.

Código de la respuesta aceptada:

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True

Código desde la parte superior de mi 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 &
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.