Advertisement
killerbng

Multi Desktop Wallpaper?

Oct 28th, 2015
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.39 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Drawing.Imaging;
  5. using System.Runtime.InteropServices;
  6.  
  7. namespace SetWallpapers
  8. {
  9.     internal class Program
  10.     {
  11.         [DllImport("user32.dll", CharSet = CharSet.Auto)]
  12.         private static extern Int32 SystemParametersInfo(UInt32 uiAction, UInt32 uiParam, String pvParam, UInt32 fWinIni);
  13.  
  14.         private static UInt32 SPI_SETDESKWALLPAPER = 20;
  15.         private static UInt32 SPIF_UPDATEINIFILE = 0x1;
  16.  
  17.         public void SetImage(string filename)
  18.         {
  19.             SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, filename, SPIF_UPDATEINIFILE);
  20.         }
  21.  
  22.         private static void Main(string[] args)
  23.         {
  24.             var images = new Dictionary<string, Image>
  25.             {
  26.                 { @"\\.\DISPLAY1", Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg") },
  27.                 { @"\\.\DISPLAY2", Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Jellyfish.jpg") },
  28.                 { @"\\.\DISPLAY3", Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Koala.jpg") }
  29.             };
  30.  
  31.             CreateBackgroundImage(images);
  32.  
  33.         }
  34.  
  35.         private static void CreateBackgroundImage(Dictionary<string, Image> imageFiles)
  36.         {
  37.             const string defaultBackgroundFile = @"C:\Users\Public\Pictures\Sample Pictures\DefaultBackground.bmp";
  38.  
  39.             using (var virtualScreenBitmap = new Bitmap((int)System.Windows.SystemParameters.VirtualScreenWidth, (int)System.Windows.SystemParameters.VirtualScreenHeight))
  40.             {
  41.                 using (var virtualScreenGraphic = Graphics.FromImage(virtualScreenBitmap))
  42.                 {
  43.                     foreach (var screen in System.Windows.Forms.Screen.AllScreens)
  44.                     {
  45.                         var image = (imageFiles.ContainsKey(screen.DeviceName)) ? imageFiles[screen.DeviceName] : null;
  46.  
  47.                         var monitorDimensions = screen.Bounds;
  48.                         var width = monitorDimensions.Width;
  49.                         var monitorBitmap = new Bitmap(width, monitorDimensions.Height);
  50.                         var fromImage = Graphics.FromImage(monitorBitmap);
  51.                         fromImage.FillRectangle(SystemBrushes.Desktop, 0, 0, monitorBitmap.Width, monitorBitmap.Height);
  52.  
  53.                         if (image != null)
  54.                             DrawImageCentered(fromImage, image, new Rectangle(0, 0, monitorBitmap.Width, monitorBitmap.Height));
  55.  
  56.                         Rectangle rectangle;
  57.                         if (monitorDimensions.Top == 0 && monitorDimensions.Left == 0)
  58.                         {
  59.                             rectangle = monitorDimensions;
  60.                         }
  61.                         else
  62.                         {
  63.                             if ((monitorDimensions.Left < 0 && monitorDimensions.Width > -monitorDimensions.Left) ||
  64.                                 (monitorDimensions.Top < 0 && monitorDimensions.Height > -monitorDimensions.Top))
  65.                             {
  66.                                 var isMain = (monitorDimensions.Top < 0 && monitorDimensions.Bottom > 0);
  67.  
  68.                                 var left = (monitorDimensions.Left < 0)
  69.                                                ? (int) System.Windows.SystemParameters.VirtualScreenWidth + monitorDimensions.Left
  70.                                                : monitorDimensions.Left;
  71.  
  72.                                 var top = (monitorDimensions.Top < 0)
  73.                                               ? (int) System.Windows.SystemParameters.VirtualScreenHeight + monitorDimensions.Top
  74.                                               : monitorDimensions.Top;
  75.  
  76.                                 Rectangle srcRect;
  77.                                 if (isMain)
  78.                                 {
  79.                                     rectangle = new Rectangle(left, 0, monitorDimensions.Width, monitorDimensions.Bottom);
  80.                                     srcRect = new Rectangle(0, -monitorDimensions.Top, monitorDimensions.Width, monitorDimensions.Height + monitorDimensions.Top);
  81.                                 }
  82.                                 else
  83.                                 {
  84.                                     rectangle = new Rectangle(0, top, monitorDimensions.Right, monitorDimensions.Height);
  85.                                     srcRect = new Rectangle(-monitorDimensions.Left, 0, monitorDimensions.Width + monitorDimensions.Left,
  86.                                                             monitorDimensions.Height);
  87.                                 }
  88.  
  89.                                 virtualScreenGraphic.DrawImage(monitorBitmap, rectangle, srcRect, GraphicsUnit.Pixel);
  90.                                 rectangle = new Rectangle(left, top, monitorDimensions.Width, monitorDimensions.Height);
  91.                             }
  92.                             else
  93.                             {
  94.                                 var left = (monitorDimensions.Left < 0)
  95.                                                ? (int) System.Windows.SystemParameters.VirtualScreenWidth + monitorDimensions.Left
  96.                                                : monitorDimensions.Left;
  97.                                 var top = (monitorDimensions.Top < 0)
  98.                                               ? (int) System.Windows.SystemParameters.VirtualScreenHeight + monitorDimensions.Top
  99.                                               : monitorDimensions.Top;
  100.                                 rectangle = new Rectangle(left, top, monitorDimensions.Width, monitorDimensions.Height);
  101.                             }
  102.                         }
  103.                         virtualScreenGraphic.DrawImage(monitorBitmap, rectangle);
  104.                     }
  105.  
  106.                     virtualScreenBitmap.Save(defaultBackgroundFile, ImageFormat.Bmp);
  107.                 }
  108.             }
  109.  
  110.             SystemParametersInfo(SPI_SETDESKWALLPAPER, 0u, defaultBackgroundFile, SPIF_UPDATEINIFILE);
  111.         }
  112.  
  113.  
  114.         private static void DrawImageCentered(Graphics g, Image img, Rectangle monitorRect)
  115.         {
  116.             float heightRatio = (float)monitorRect.Height / (float)img.Height;
  117.             float widthRatio = (float)monitorRect.Width / (float)img.Width;
  118.             int height = monitorRect.Height;
  119.             int width = monitorRect.Width;
  120.             int x = 0;
  121.             int y = 0;
  122.  
  123.             if (heightRatio > 1f && widthRatio > 1f)
  124.             {
  125.                 height = img.Height;
  126.                 width = img.Width;
  127.                 x = (int)((float)(monitorRect.Width - width) / 2f);
  128.                 y = (int)((float)(monitorRect.Height - height) / 2f);
  129.             }
  130.             else
  131.             {
  132.                 if (heightRatio < widthRatio)
  133.                 {
  134.                     width = (int)((float)img.Width * heightRatio);
  135.                     height = (int)((float)img.Height * heightRatio);
  136.                     x = (int)((float)(monitorRect.Width - width) / 2f);
  137.                 }
  138.                 else
  139.                 {
  140.                     width = (int)((float)img.Width * widthRatio);
  141.                     height = (int)((float)img.Height * widthRatio);
  142.                     y = (int)((float)(monitorRect.Height - height) / 2f);
  143.                 }
  144.             }
  145.  
  146.             Rectangle rect = new Rectangle(x, y, width, height);
  147.             g.DrawImage(img, rect);
  148.         }
  149.     }
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement