Как заставить фон рабочего стола 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 на всякий случай.
Okuma.Scott

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

Строка из принятого ответа работала у меня очень спорадически. Я закончил тем, что написал цикл while, чтобы молча вызывать код в фоновом режиме 25 раз. Надеюсь это поможет.

Код из принятого ответа:

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True

Код из верхней части моего скрипта 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 &
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.