Як змусити фон робочого столу Windows оновлювати або оновлювати


17

Якщо я вручну змінюю фонове зображення в реєстрі, як змусити його оновитись, не виходячи з системи?

Я знаю, що bginfo це робить, але я хотів би просто робити речі і не використовувати жодне програмне забезпечення.

Відповіді:


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

7
Схоже, це не працює у win7 x64 ... у когось щось працює для цього?
Джон Клоске

3
Використовуючи його, як RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, Trueздається, працює на моїй машині (зверніть увагу на відсутність коми через UpdatePerUserSystemParameters)
Туманність

Можна підтвердити, що насправді не оновлює робочий стіл на Win7 x64. Намагався викликати обидві версії RunDll про всяк випадок.
Скотт Солмер

3
  • Відкрити менеджер завдань
  • Убити explorer.exe
  • Якщо оболонка не відразу перезавантажиться
  • У меню виберіть Файл> Нове завдання
  • Введіть "explorer.exe" і натисніть клавішу Enter.

Гарна думка, але це просто не вирішує.
Натан Струц

2

Я намагався зробити щось подібне - оновити налаштування реєстру для меню "Пуск", а потім негайно мати меню "Пуск" відобразити зміни.

Рішення з цього питання MSDN працювало для мене чудово.

Ви можете спробувати транслювати WM_SETTINGCHANGEповідомлення. Наприклад:

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

Змініть роздільну здатність екрана, а потім оберіть опцію повернення. Ваша роздільна здатність залишиться такою ж, і фон зміниться.

Крім того, відключіть і підключіть кабель дисплея.


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
Це виглядає приємно, але чому всі диски речі там?
not2qubit

0

Рядок із прийнятої відповіді працював для мене дуже спорадично. Я закінчив писати цикл часу, щоб 25 разів мовчки зателефонувати на задньому плані. Сподіваюсь, це допомагає.

Код із прийнятої відповіді:

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True

Код у верхній частині мого скрипту:

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 &
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.