title: How to set Wallpaper style (Fill, stretch) according to windows version
body: <p>I am trying to make a wallpaper style stretched if Windows version is Vista, 
  and Fill in case of windows 7, in VB.NET. I got the program to change a Wallpaper , but Im having a problem with applying a style. ( Program consists of a browse button, picture box and Apply button).
  Your help would be appreciated.
  Here is the code :</p>
  
  <pre><code>    Imports System.IO
      Imports Microsoft.Win32
      Imports System.Environment
      Imports System.Drawing.Imaging
      Imports System.ComponentModel
      Imports System.Runtime.InteropServices
  
      Public Class Form1
  
      Private Property c As Object
  
      Private Declare Auto Function SystemParametersInfo Lib "user32.dll" (ByVal 
      As Integer, ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer
  
      Public Shared Sub SetWallpaper(ByVal Wallpaper As Object, ByVal style As WallpaperStyle)
  
          Dim Background As System.Drawing.Image = Nothing
          If TypeOf Wallpaper Is String Then
              Background = System.Drawing.Image.FromFile(Wallpaper)
          ElseIf TypeOf Wallpaper Is Image Then
              Background = Wallpaper
  
          Else
              Exit Sub
          End If
  
          Dim Location As String = Environment.SystemDirectory &amp; "\CurrentWallpaper.Bmp"
  
          Background.Save(Location, System.Drawing.Imaging.ImageFormat.Bmp)
          SystemParametersInfo(&amp;H14, 0, Location, &amp;H1 Or &amp;H2)
  
  
  
          Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True)
  
  
          Select Case style
              Case WallpaperStyle.Tile
                  key.SetValue("WallpaperStyle", "0")
                  key.SetValue("TileWallpaper", "1")
                  Exit Select
              Case WallpaperStyle.Center
                  key.SetValue("WallpaperStyle", "0")
                  key.SetValue("TileWallpaper", "0")
                  Exit Select
              Case WallpaperStyle.Stretch
                  key.SetValue("WallpaperStyle", "2")
                  key.SetValue("TileWallpaper", "0")
                  Exit Select
              Case WallpaperStyle.Fit ' (Windows 7 and later)
                  key.SetValue("WallpaperStyle", "6")
                  key.SetValue("TileWallpaper", "0")
                  Exit Select
              Case WallpaperStyle.Fill ' (Windows 7 and later)
                  key.SetValue("WallpaperStyle", "10")
                  key.SetValue("TileWallpaper", "0")
                  Exit Select
          End Select
  
  
  
          key.Close()
  
      End Sub
  
      Private ReadOnly Property SelectedWallpaperStyle() As WallpaperStyle
  
          Get
              If (Environment.OSVersion.Version &gt;= New Version(6, 1)) Then
                  Return WallpaperStyle.Fill
  
              Else : Return WallpaperStyle.Stretch
  
              End If
  
          End Get
  
      End Property
  
  
  
          Private Sub Button1_Click(sender As System.Object, e As                                                                                               System.EventArgs)Handles              Button1.Click   'Browse button
  
          Dim res As DialogResult
  
          OpenFileDialog1.Filter = "Picture files (*.bmp .jpg .gif) |*.bmp;*.jpg;*.gif"
  
          OpenFileDialog1.InitialDirectory = path
          res = OpenFileDialog1.ShowDialog
  
  
          If res = Windows.Forms.DialogResult.OK Then
              PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
              TextBox1.Text = OpenFileDialog1.FileName
  
          End If
  
      End Sub
  
      Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles               Button2.Click 'Apply button
  
          SetWallpaper(OpenFileDialog1.FileName, SelectedWallpaperStyle())
  
      End Sub
  </code></pre>
  
  <p>EDIT : I found the solution.I went a slightly different way.( i found a similar example on the net.) 
  I have a main form , and i added a new class called : wallpaper.vb
  the code in wallpaper.vb goes : </p>
  
  <pre><code>Imports Microsoft.Win32
  Imports System.Environment
  Imports System.Drawing.Imaging
  Imports System.ComponentModel
  Imports System.Runtime.InteropServices
  
  
  Public Class Wallpaper
  
      ' determine if jpg is supported by OS
  
      Public Shared ReadOnly Property SupportJpgAsWallpaper()
          Get
              Return (Environment.OSVersion.Version &gt;= New Version(6, 0))
          End Get
      End Property
  
      ' determine if fit and fill are supported by OS
      Public Shared ReadOnly Property SupportFitFillWallpaperStyles()
          Get
              Return (Environment.OSVersion.Version &gt;= New Version(6, 1))
          End Get
      End Property
  
  
      '  SETTING THE WALLPAPER
      Public Shared Sub SetDesktopWallpaper(ByVal path As String, ByVal style As WallpaperStyle)
  
          ' Set the wallpaper style and tile. 
          ' Two registry values are set in the Control Panel\Desktop key.
          ' 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)
          Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True)
  
          Select Case style
              Case WallpaperStyle.Tile
                  key.SetValue("WallpaperStyle", "0")
                  key.SetValue("TileWallpaper", "1")
                  Exit Select
              Case WallpaperStyle.Center
                  key.SetValue("WallpaperStyle", "0")
                  key.SetValue("TileWallpaper", "0")
                  Exit Select
              Case WallpaperStyle.Stretch
                  key.SetValue("WallpaperStyle", "2")
                  key.SetValue("TileWallpaper", "0")
                  Exit Select
              Case WallpaperStyle.Fit ' (Windows 7 and later)
                  key.SetValue("WallpaperStyle", "6")
                  key.SetValue("TileWallpaper", "0")
                  Exit Select
              Case WallpaperStyle.Fill ' (Windows 7 and later)
                  key.SetValue("WallpaperStyle", "10")
                  key.SetValue("TileWallpaper", "0")
                  Exit Select
          End Select
  
          key.Close()
  
          ' is jpg and bmp are supported
  
          Dim ext As String = System.IO.Path.GetExtension(path)
          If ((Not ext.Equals(".bmp", StringComparison.OrdinalIgnoreCase) AndAlso _
               Not ext.Equals(".jpg", StringComparison.OrdinalIgnoreCase)) _
              OrElse _
              (ext.Equals(".jpg", StringComparison.OrdinalIgnoreCase) AndAlso _
              (Not SupportJpgAsWallpaper))) Then
  
              Using image As Image = image.FromFile(path)
                  path = String.Format("{0}\Microsoft\Windows\Themes\{1}.bmp", _
                      Environment.GetFolderPath(SpecialFolder.ApplicationData), _
                      System.IO.Path.GetFileNameWithoutExtension(path))
                  image.Save(path, ImageFormat.Bmp)
              End Using
  
          End If
  
  
          If Not Wallpaper.SystemParametersInfo(20, 0, path, 3) Then
              Try
  
              Catch ex As Exception
  
              End Try
  
          End If
      End Sub
  
  
      &lt;DllImport("user32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)&gt; _
      Private Shared Function SystemParametersInfo( _
          ByVal uiAction As UInt32, _
          ByVal uiParam As UInt32, _
          ByVal pvParam As String, _
          ByVal fWinIni As UInt32) _
          As &lt;MarshalAs(UnmanagedType.Bool)&gt; Boolean
      End Function
  
      Private Const SPI_SETDESKWALLPAPER As UInt32 = 20
      Private Const SPIF_SENDWININICHANGE As UInt32 = 2
      Private Const SPIF_UPDATEINIFILE As UInt32 = 1
  End Class
  
  
  Public Enum WallpaperStyle
      Tile
      Center
      Stretch
      Fit
      Fill
  End Enum
  </code></pre>
  
  <hr>
  
  <p>and then in the mainform (mainform vb) in button1 (which sets the wallpaper if clicked) added the following code which has the selected wallpaper style:</p>
  
  <pre><code> Private Sub btnSetWallpaper_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
      Handles btnSetWallpaper.Click
  
          Dim pozadina As String = OpenFileDialog1.FileName
          If Not String.IsNullOrEmpty(Me.wallpaperFileName) And textbox1.Text = pozadina Then
              Wallpaper.SetDesktopWallpaper(Me.wallpaperFileName, Me.SelectedWallpaperStyle)
  
          End If
  
  End Sub
  </code></pre>
  
  <p>thats it.</p>