Windows

使用正確解析度的背景桌面圖像

  • October 15, 2012

我有六種不同解析度的桌面背景圖像(圖片),我想將其部署到具有不同顯示器和影片卡之類的不同電腦集合中。筆記型電腦、上網本、台式機、寬屏,甚至是幾個“高”螢幕。我有圖像可以涵蓋大多數情況。

我希望 Windows 7 通過組策略正確選擇正確的桌面背景圖像。

現在,登錄螢幕已經完成。OEMBackground方法相當聰明,可以讓你將不同解析度的文件複製到機器上,登錄應用程序會計算顯示器的縱橫比並儘可能地匹配文件。

有沒有辦法在桌面背景上也有這個功能?

嗯。如果幸運的話,Win32_DesktopMonitor WMI 類的 ScreenHeight 和 ScreenWidth 屬性將在客戶端填寫,這意味著您可以輕鬆地使用 VB 腳本或 Powershell 腳本來確定電腦的桌面解析度。

Get-WMIObject Win32_DesktopMonitor

現在您知道電腦的解析度,您可以像這樣設置適當的桌面。以下腳本作者的學分在評論中:

#requires -version 2.0
## Set-Wallpaper - set your windows desktop wallpaper
###################################################################################################
## Usage:
##    Set-Wallpaper "C:\Users\Joel\Pictures\Wallpaper\Dual Monitor\mandolux-tiger.jpg" "Tile"
##    ls *.jpg | get-random | Set-Wallpaper
##    ls *.jpg | get-random | Set-Wallpaper -Style "Stretch"
###################################################################################################
## History:
##    v0.5  First release (on #PowerShell@irc.freenode.net)
##    v1.0  Public release (http://www.poshcode.org/488)
##          - Added Style: Tile|Center|Stretch
##    v1.1  This Release
##          - Added "NoChange" style to just use the style setting already set
##          - Made the Style parameter to the cmdlet optional
###################################################################################################

add-type @"
using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace Wallpaper
{
  public enum Style : int
  {
      Tile, Center, Stretch, NoChange
  }


  public class Setter {
     public const int SetDesktopWallpaper = 20;
     public const int UpdateIniFile = 0x01;
     public const int SendWinIniChange = 0x02;

     [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
     private static extern int SystemParametersInfo (int uAction, int uParam, string lpvParam, int fuWinIni);

     public static void SetWallpaper ( string path, Wallpaper.Style style ) {
        SystemParametersInfo( SetDesktopWallpaper, 0, path, UpdateIniFile | SendWinIniChange );

        RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true);
        switch( style )
        {
           case Style.Stretch :
              key.SetValue(@"WallpaperStyle", "2") ; 
              key.SetValue(@"TileWallpaper", "0") ;
              break;
           case Style.Center :
              key.SetValue(@"WallpaperStyle", "1") ; 
              key.SetValue(@"TileWallpaper", "0") ; 
              break;
           case Style.Tile :
              key.SetValue(@"WallpaperStyle", "1") ; 
              key.SetValue(@"TileWallpaper", "1") ;
              break;
           case Style.NoChange :
              break;
        }
        key.Close();
     }
  }
}
"@

cmdlet Set-Wallpaper {
Param(
  [Parameter(Position=0, Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
  [Alias("FullName")]
  [string]
  $Path
,
  [Parameter(Position=1, Mandatory=$false)]
  [Wallpaper.Style]
  $Style = "NoChange"
)
  [Wallpaper.Setter]::SetWallpaper( (Convert-Path $Path), $Style )
}

請注意,您必須 P/Invoke user32.dll 來設置牆紙,這可能意味著 VB 腳本可能無法完成此操作。

這是一種更短、更簡單的方法,儘管它可能需要註銷/登錄才能生效:

Function Set-WallPaper($Value)
{    
 Set-ItemProperty -path 'HKCU:\Control Panel\Desktop\' -name wallpaper -value $value

 rundll32.exe user32.dll, UpdatePerUserSystemParameters

}

方法 2:此外,您可以在同一 WMI 類上使用 GPO WMI 過濾器,並根據該 WMI 過濾器的結果設置不同的桌面。因此,例如,您可以在網路共享上託管所有可變大小的桌面,或者您可以使用組策略在每個客戶端上預留所有桌面。然後,為每種不同尺寸的桌面製作一個 GPO,並將其上的 WMI 過濾器設置為僅在 Win32_DesktopMonitor.ScreenWidth = 1920 時應用,依此類推。

引用自:https://serverfault.com/questions/438708