How to change the wallpaper position or fit using python script?

Meet V 1 Reputation point
2022-04-07T04:37:46.45+00:00

Hello,

Using the SystemParametersInfoW(SPI_SETDESKWALLPAPER, _ , _ , _ ) parameter, we can change the desktop wallpaper programmatically using following python script:

import ctypes
path = "your_wallpaper_path"
SPI_SETDESKWALLPAPER = 20
ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, path , 0)

However, this only changes the wallpaper file. How do we change the wallpaper position or fit? viz. Fit / Fill / Span / Tile / Centered etc.

Windows for business | Windows Client for IT Pros | User experience | Other
0 comments No comments
{count} votes

2 answers

Sort by: Most helpful
  1. @CmdrKeene 131 Reputation points Volunteer Moderator
    2022-04-09T20:18:19.163+00:00

    I can't find any reference to a public API for accomplishing it directly that way, but I can at least offer one alternative of this PowerShell command, perhaps you can execute this from within your script.

    New-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name WallpaperStyle -PropertyType String -Value 10 -Force

    0 comments No comments

  2. Limitless Technology 44,776 Reputation points
    2022-04-13T11:30:09.497+00:00

    Hello,

    there is a lot of information around on how to create the script according to the windows version, etc. You can see in the thread the text of a archived MSDN page documentation:

    The following steps walk through a demonstration of the code sample.

    Step1. After you successfully build the sample project in Visual Studio 2008,
    you will get an application: CSSetDesktopWallpaper.exe.

    Step2. Run the application on a Windows 7 system. The form consists of a
    button to browse to an image, a picture box to preview the selected image, a
    group of radio buttons to configure the style, and a button to set the
    desktop wallpaper as that image.

    The Fit and Fill wallpaper styles are not supported before Windows 7, so if
    the current operating system prior to Windows 7, e.g. Windows XP, only the
    Tile, Center and Stretch styles are enabled.

    Step3. Click the Browse... button to select an image file. You will see a
    preview of the selected image in the picture box.

    Step4. Check the Title style, and click the Set Wallpaper button. The
    wallpaper is tiled across the screen. If you check the Stretch style, and
    click the Set Wallpaper button, the wallpaper is stretched vertically and
    horizontally to fit the screen.

    Step5. Close the application.

    Implementation:

    Step1. Create a new Visual C# Windows Forms project named
    CSSetDesktopWallpaper. Add controls to the main form. The form consists of a
    button to browse to an image, a picture box to preview the selected image, a
    group of radio buttons to configure the style, and a button to set the
    desktop wallpaper as that image.

    Step2. Design the Wallpaper helper methods in Wallpaper.cs.

    Wallpaper.SetDesktopWallpaper(string path, WallpaperStyle style)

    This is the key method that sets the desktop wallpaper. The method body is
    composed of configuring the wallpaper style in the registry and setting the
    wallpaper with SystemParametersInfo.

    1) Configuring the wallpaper style in the registry

    Desktop wallpaper can use one of three (or five, if the operating system is
    Windows 7 or later) different sizing styles for display.

    Tile: Wallpaper is tiled across the screen.
    Center: Wallpaper is centered on the screen.
    Stretch: Wallpaper is stretched vertically and horizontally to fit the
    screen.
    Fit: Wallpaper is resized to fit the screen while maintaining the
    aspect ratio. (Windows 7 and later)
    Fill: Wallpaper is resized and cropped to fill the screen while
    maintaining the aspect ratio. (Windows 7 and later)

    In order to support these three styles in an object-oriented way, an
    enumerated type was created.

    public enum WallpaperStyle
    {
    Tile,
    Center,
    Stretch,
    Fit,
    Fill
    }

    Two registry values are set in the Control Panel\Desktop key. Based on
    which style is requested, numeric codes are set for the WallpaperStyle and
    TileWallpaper values:

    http://msdn.microsoft.com/en-us/library/bb773190(VS.85).aspx#desktop'>http://msdn.microsoft.com/en-us/library/bb773190(VS.85).aspx#desktop

    TileWallpaper
    0: The wallpaper picture should not be tiled
    1: The wallpaper picture should be tiled

    WallpaperStyle
    0: The image is centered if TileWallpaper=0 or tiled if TileWallpaper=1
    2: The image is stretched to fill the screen
    6: The image is resized to fit the screen while maintaining the aspect
    ratio. (Windows 7 and later)
    10: The image is resized and cropped to fill the screen while maintaining
    the aspect ratio. (Windows 7 and later)

    RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);

    switch (style)
    {
    case WallpaperStyle.Tile:
    key.SetValue(@"WallpaperStyle", "0");
    key.SetValue(@"TileWallpaper", "1");
    break;
    case WallpaperStyle.Center:
    key.SetValue(@"WallpaperStyle", "0");
    key.SetValue(@"TileWallpaper", "0");
    break;
    case WallpaperStyle.Stretch:
    key.SetValue(@"WallpaperStyle", "2");
    key.SetValue(@"TileWallpaper", "0");
    break;
    case WallpaperStyle.Fit: // (Windows 7 and later)
    key.SetValue(@"WallpaperStyle", "6");
    key.SetValue(@"TileWallpaper", "0");
    break;
    case WallpaperStyle.Fill: // (Windows 7 and later)
    key.SetValue(@"WallpaperStyle", "10");
    key.SetValue(@"TileWallpaper", "0");
    break;
    }

    key.Close();

    2) Setting the wallpaper with SystemParametersInfo

    At this point, the sizing options have been set, but the actual image path
    still needs to be set. The SystemParametersInfo function exists in the
    user32.dll to allow you to set or retrieve hardware and configuration
    information from your system. The function accepts four arguments. The
    first indicates the operation to take place, the second two parameters
    represent data to be set, dependant on requested operation, and the final
    parameter allows you to specify how changes are saved and/or broadcasted.

    [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SystemParametersInfo(uint uiAction, uint uiParam,
    string pvParam, uint fWinIni);

    In addition to importing the function, you will need to define some
    constants for use with it. The first constant represents the wallpaper
    operation to take place in this sample, to be used in the first argument.
    The other two constants will be combined together for the final argument.

    private const uint SPI_SETDESKWALLPAPER = 20;
    private const uint SPIF_UPDATEINIFILE = 0x01;
    private const uint SPIF_SENDWININICHANGE = 0x02;

    The operation to be invoked is SPI_SETDESKWALLPAPER. It sets the desktop
    wallpaper. The value of the pvParam parameter determines file path of the
    new wallpaper. The file must be a bitmap (.bmp). On Windows Vista and later
    pvParam can also specify a .jpg file. If the specified image file is
    neither .bmp nor .jpg, or if the image is a .jpg file but the operating
    system is Windows Server 2003 or Windows XP/2000 that does not support .jpg
    as the desktop wallpaper, we convert the image file to .bmp and save it to
    the %appdata%\Microsoft\Windows\Themes folder.

    string ext = Path.GetExtension(path);
    if ((!ext.Equals(".bmp", StringComparison.OrdinalIgnoreCase) &&
    !ext.Equals(".jpg", StringComparison.OrdinalIgnoreCase))
    ||
    (ext.Equals(".jpg", StringComparison.OrdinalIgnoreCase) &&
    !SupportJpgAsWallpaper))
    {
    using (Image image = Image.FromFile(path))
    {
    path = String.Format(@"{0}\Microsoft\Windows\Themes{1}.bmp",
    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
    Path.GetFileNameWithoutExtension(path));
    image.Save(path, ImageFormat.Bmp);
    }
    }

    // Set the desktop wallpapaer by calling the Win32 API SystemParametersInfo
    // with the SPI_SETDESKWALLPAPER desktop parameter. The changes should
    // persist, and also be immediately visible.
    if (!SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path,
    SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE))
    {
    throw new Win32Exception();
    }

    Setting pvParam to ******************** or null in the above call reverts
    to the default wallpaper.

    Of course everything written and explained here:

    MSDN: SystemParametersInfo Function
    http://msdn.microsoft.com/en-us/library/ms724947(VS.85).aspx

    MSDN: Theme File Format
    http://msdn.microsoft.com/en-us/library/bb773190(VS.85).aspx#desktop'>http://msdn.microsoft.com/en-us/library/bb773190(VS.85).aspx#desktop

    Setting Wallpaper


    The following steps walk through a demonstration of the code sample.

    Step1. After you successfully build the sample project in Visual Studio 2008,
    you will get an application: CSSetDesktopWallpaper.exe.

    Step2. Run the application on a Windows 7 system. The form consists of a
    button to browse to an image, a picture box to preview the selected image, a
    group of radio buttons to configure the style, and a button to set the
    desktop wallpaper as that image.

    The Fit and Fill wallpaper styles are not supported before Windows 7, so if
    the current operating system prior to Windows 7, e.g. Windows XP, only the
    Tile, Center and Stretch styles are enabled.

    Step3. Click the Browse... button to select an image file. You will see a
    preview of the selected image in the picture box.

    Step4. Check the Title style, and click the Set Wallpaper button. The
    wallpaper is tiled across the screen. If you check the Stretch style, and
    click the Set Wallpaper button, the wallpaper is stretched vertically and
    horizontally to fit the screen.

    Step5. Close the application.

    Implementation:

    Step1. Create a new Visual C# Windows Forms project named
    CSSetDesktopWallpaper. Add controls to the main form. The form consists of a
    button to browse to an image, a picture box to preview the selected image, a
    group of radio buttons to configure the style, and a button to set the
    desktop wallpaper as that image.

    Step2. Design the Wallpaper helper methods in Wallpaper.cs.

    Wallpaper.SetDesktopWallpaper(string path, WallpaperStyle style)

    This is the key method that sets the desktop wallpaper. The method body is
    composed of configuring the wallpaper style in the registry and setting the
    wallpaper with SystemParametersInfo.

    1) Configuring the wallpaper style in the registry

    Desktop wallpaper can use one of three (or five, if the operating system is
    Windows 7 or later) different sizing styles for display.

    Tile: Wallpaper is tiled across the screen.
    Center: Wallpaper is centered on the screen.
    Stretch: Wallpaper is stretched vertically and horizontally to fit the
    screen.
    Fit: Wallpaper is resized to fit the screen while maintaining the
    aspect ratio. (Windows 7 and later)
    Fill: Wallpaper is resized and cropped to fill the screen while
    maintaining the aspect ratio. (Windows 7 and later)

    In order to support these three styles in an object-oriented way, an
    enumerated type was created.

    public enum WallpaperStyle
    {
    Tile,
    Center,
    Stretch,
    Fit,
    Fill
    }

    Two registry values are set in the Control Panel\Desktop key. Based on
    which style is requested, numeric codes are set for the WallpaperStyle and
    TileWallpaper values:

    http://msdn.microsoft.com/en-us/library/bb773190(VS.85).aspx#desktop'>http://msdn.microsoft.com/en-us/library/bb773190(VS.85).aspx#desktop

    TileWallpaper
    0: The wallpaper picture should not be tiled
    1: The wallpaper picture should be tiled

    WallpaperStyle
    0: The image is centered if TileWallpaper=0 or tiled if TileWallpaper=1
    2: The image is stretched to fill the screen
    6: The image is resized to fit the screen while maintaining the aspect
    ratio. (Windows 7 and later)
    10: The image is resized and cropped to fill the screen while maintaining
    the aspect ratio. (Windows 7 and later)

    RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);

    switch (style)
    {
    case WallpaperStyle.Tile:
    key.SetValue(@"WallpaperStyle", "0");
    key.SetValue(@"TileWallpaper", "1");
    break;
    case WallpaperStyle.Center:
    key.SetValue(@"WallpaperStyle", "0");
    key.SetValue(@"TileWallpaper", "0");
    break;
    case WallpaperStyle.Stretch:
    key.SetValue(@"WallpaperStyle", "2");
    key.SetValue(@"TileWallpaper", "0");
    break;
    case WallpaperStyle.Fit: // (Windows 7 and later)
    key.SetValue(@"WallpaperStyle", "6");
    key.SetValue(@"TileWallpaper", "0");
    break;
    case WallpaperStyle.Fill: // (Windows 7 and later)
    key.SetValue(@"WallpaperStyle", "10");
    key.SetValue(@"TileWallpaper", "0");
    break;
    }

    key.Close();

    2) Setting the wallpaper with SystemParametersInfo

    At this point, the sizing options have been set, but the actual image path
    still needs to be set. The SystemParametersInfo function exists in the
    user32.dll to allow you to set or retrieve hardware and configuration
    information from your system. The function accepts four arguments. The
    first indicates the operation to take place, the second two parameters
    represent data to be set, dependant on requested operation, and the final
    parameter allows you to specify how changes are saved and/or broadcasted.

    [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SystemParametersInfo(uint uiAction, uint uiParam,
    string pvParam, uint fWinIni);

    In addition to importing the function, you will need to define some
    constants for use with it. The first constant represents the wallpaper
    operation to take place in this sample, to be used in the first argument.
    The other two constants will be combined together for the final argument.

    private const uint SPI_SETDESKWALLPAPER = 20;
    private const uint SPIF_UPDATEINIFILE = 0x01;
    private const uint SPIF_SENDWININICHANGE = 0x02;

    The operation to be invoked is SPI_SETDESKWALLPAPER. It sets the desktop
    wallpaper. The value of the pvParam parameter determines file path of the
    new wallpaper. The file must be a bitmap (.bmp). On Windows Vista and later
    pvParam can also specify a .jpg file. If the specified image file is
    neither .bmp nor .jpg, or if the image is a .jpg file but the operating
    system is Windows Server 2003 or Windows XP/2000 that does not support .jpg
    as the desktop wallpaper, we convert the image file to .bmp and save it to
    the %appdata%\Microsoft\Windows\Themes folder.

    string ext = Path.GetExtension(path);
    if ((!ext.Equals(".bmp", StringComparison.OrdinalIgnoreCase) &&
    !ext.Equals(".jpg", StringComparison.OrdinalIgnoreCase))
    ||
    (ext.Equals(".jpg", StringComparison.OrdinalIgnoreCase) &&
    !SupportJpgAsWallpaper))
    {
    using (Image image = Image.FromFile(path))
    {
    path = String.Format(@"{0}\Microsoft\Windows\Themes{1}.bmp",
    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
    Path.GetFileNameWithoutExtension(path));
    image.Save(path, ImageFormat.Bmp);
    }
    }

    // Set the desktop wallpapaer by calling the Win32 API SystemParametersInfo
    // with the SPI_SETDESKWALLPAPER desktop parameter. The changes should
    // persist, and also be immediately visible.
    if (!SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path,
    SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE))
    {
    throw new Win32Exception();
    }

    Setting pvParam to ******************** or null in the above call reverts
    to the default wallpaper.

    References:

    MSDN: SystemParametersInfo Function
    http://msdn.microsoft.com/en-us/library/ms724947(VS.85).aspx

    MSDN: Theme File Format
    http://msdn.microsoft.com/en-us/library/bb773190(VS.85).aspx#desktop'>http://msdn.microsoft.com/en-us/library/bb773190(VS.85).aspx#desktop


    --If the reply is helpful, please Upvote and Accept as answer--


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.