Cách buộc nền màn hình Windows để cập nhật hoặc làm mới


17

Nếu tôi tự thay đổi hình nền trong sổ đăng ký, làm thế nào tôi có thể buộc nó làm mới mà không cần đăng xuất?

Tôi biết rằng bginfo làm điều đó, nhưng tôi muốn giữ mọi thứ đơn giản và không sử dụng bất kỳ phần mềm nào.

Câu trả lời:


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

7
Điều này dường như không hoạt động trong win7 x64 ... bất cứ ai cũng có cái gì đó hoạt động cho điều đó?
Jon Kloske

3
Sử dụng nó RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, Truedường như hoạt động trên máy của tôi (lưu ý dấu phẩy bị thiếu phía sau UpdatePerUserSystemParameter)
Tinh vân

Có thể xác nhận, không thực sự làm mới máy tính để bàn trên Win7 x64. Đã thử gọi cả hai phiên bản RunDll chỉ trong trường hợp.
Okuma. Hủy

3
  • Quản lý tác vụ mở
  • Giết explorer.exe
  • Nếu shell không khởi động lại ngay lập tức
  • Từ menu chọn Tệp> Tác vụ mới
  • Nhập "explorer.exe" và nhấn enter.

Suy nghĩ tốt, nhưng điều đó chỉ đơn giản là không giải quyết nó.
Nathan Strutz

2

Tôi đã cố gắng làm một cái gì đó tương tự - cập nhật cài đặt đăng ký cho menu bắt đầu và sau đó ngay lập tức có menu bắt đầu phản ánh các thay đổi.

Giải pháp từ câu hỏi MSDN này đã làm việc cho tôi một cách hoàn hảo.

Bạn có thể thử phát một WM_SETTINGCHANGEtin nhắn. Ví dụ:

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

Thay đổi độ phân giải màn hình, sau đó chọn tùy chọn hoàn nguyên. Độ phân giải của bạn sẽ giữ nguyên và nền sẽ thay đổi.

Ngoài ra, ngắt kết nối và kết nối lại cáp hiển thị.


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
Điều này nhìn tốt đẹp, nhưng tại sao tất cả các công cụ ổ đĩa trong đó?
not2qubit

0

Dòng từ câu trả lời được chấp nhận làm việc cho tôi rất rời rạc. Tôi đã kết thúc việc viết một vòng lặp while để gọi mã âm thầm trong nền 25 lần. Hi vọng điêu nay co ich.

Mã từ câu trả lời được chấp nhận:

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True

Mã từ đầu tập lệnh bash của tôi:

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 &
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.