Jak zmusić tło pulpitu Windows do aktualizacji lub odświeżenia

15

Jeśli ręcznie zmienię obraz tła w rejestrze, jak mogę zmusić go do odświeżenia bez wylogowania?

Wiem, że bginfo to robi, ale chciałbym uprościć sprawę i nie używać żadnego oprogramowania.

RASG
źródło

Odpowiedzi:

14
RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True
Matthewk
źródło
7
Wydaje się, że to nie działa w Win7 x64 ... Czy ktoś ma coś, co na to działa?
Jon Kloske
3
Używanie go, jak się RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, Truewydaje, działa na moim komputerze (zwróć uwagę na brakujący przecinek za UpdatePerUserSystemParameters)
Nebula
Potwierdza, nie odświeża pulpitu na Win7 x64. Na wszelki wypadek próbowałem wywołać obie wersje RunDll.
Okuma.Scott,
3
  • Otwórz Menedżera zadań
  • Zabij explorer.exe
  • Jeśli powłoka nie zostanie natychmiast ponownie uruchomiona
  • Z menu wybierz Plik> Nowe zadanie
  • Wpisz „explorer.exe” i naciśnij klawisz Enter.
SecurityMatt
źródło
Dobra myśl, ale to po prostu nie rozwiązuje problemu.
Nathan Strutz
2

Próbowałem zrobić coś podobnego - zaktualizuj ustawienia rejestru dla menu Start, a następnie natychmiast niech menu Start odzwierciedla zmiany.

Rozwiązanie z tego pytania MSDN działało dla mnie idealnie.

Możesz spróbować WM_SETTINGCHANGEwysłać wiadomość. Na przykład:

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);
    }
}
mcw0933
źródło
1

Zmień rozdzielczość ekranu, a następnie wybierz opcję przywracania. Twoja rozdzielczość pozostanie taka sama, a tło się zmieni.

Ewentualnie odłącz i ponownie podłącz kabel wyświetlacza.

Dan
źródło
0
# 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 testowy
źródło
0

Linia od zaakceptowanej odpowiedzi działała dla mnie bardzo sporadycznie. Skończyło się na tym, że napisałem pętlę while, aby po cichu wywołać kod w tle 25 razy. Mam nadzieję że to pomoże.

Kod z zaakceptowanej odpowiedzi:

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True

Kod z góry mojego skryptu 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 &
WarTurtle
źródło