Windows masaüstü arka planını güncellemeye veya yenilemeye zorlama


17

Kayıt defterindeki arka plan resmini el ile değiştirirsem oturumu kapatmadan yenilemeyi nasıl zorlayabilirim?

Bunu biliyorum BGInfo yapar, ama şeyleri basit tutmak ve herhangi bir yazılım kullanmak istiyorum.

Yanıtlar:


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

7
Bu win7 x64'te işe yaramıyor gibi görünüyor ... kimse bunun için çalışan bir şey var mı?
Jon Kloske

3
RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, TrueMakinemde çalışıyor gibi görünüyor (UpdatePerUserSystemParameters'ın arkasındaki eksik virgül dikkat edin)
Nebula

Onaylayabilir, Win7 x64'te masaüstünü yenilemez. Her iki durumda da RunDll'in her iki sürümünü çağırmayı denedim.
Scott Solmer

3
  • Görev yöneticisini aç
  • Explorer.exe'yi öldür
  • Kabuk hemen yeniden başlamazsa
  • Menüden Dosya> Yeni Görev'i seçin
  • "Explorer.exe" yazın ve enter tuşuna basın.

İyi fikir, ama bu sadece çözmez.
Nathan Strutz

2

Benzer bir şey yapmaya çalışıyordum - başlat menüsü için bir kayıt defteri ayarını güncelleyin ve hemen başlat menüsünün değişiklikleri yansıtmasını sağlayın.

Bu MSDN sorununun çözümü benim için mükemmel çalıştı.

Bir WM_SETTINGCHANGEmesaj yayınlamayı deneyebilirsiniz . Örneğin:

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

Ekran çözünürlüğünü değiştirin, ardından geri alma seçeneğini belirleyin. Çözümünüz aynı kalacak ve arka plan değişmiş olacaktır.

Alternatif olarak, ekran kablosunu çıkarıp yeniden takın.


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
Bu güzel gözüküyor, ama neden oradaki tüm araba sürücüleri ?
not2qubit

0

Kabul edilen cevaptan gelen hat benim için çok ara sıra çalıştı. 25 kez arka planda sessizce kodu aramak için bir while döngüsü yazma sona erdi. Bu yardımcı olur umarım.

Kabul edilen cevaptan kod:

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True

Bas betiğimin üst kısmındaki kod:

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 &
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.