public static void CreateBackgroundImage(Dictionary <string, DesktopImage> images, Dictionary <string, Form> controlerForms) { var result = ScaledScreen.GetPerMonitorDPIAware(); if (result != ScaledScreen.PROCESS_DPI_AWARENESS.PROCESS_PER_MONITOR_DPI_AWARE) { ScaledScreen.SetPerMonitorDPIAware(); } ScaledScreen[] scaledScreens = ScaledScreen.AllScaledScreens; using (var virtualScreenBitmap = CreateScreenBitmap(scaledScreens)) { using (var virtualScreenGraphic = Graphics.FromImage(virtualScreenBitmap)) { foreach (var scaledScreen in scaledScreens) { if (!images.ContainsKey(scaledScreen.DeviceName)) { break; } var desktopImage = images[scaledScreen.DeviceName]; //var monitorDimensions = scaledScreen.Bounds; var monitorBitmap = new Bitmap(scaledScreen.UnscaledBounds.Width, scaledScreen.UnscaledBounds.Height); var monitorGraphics = Graphics.FromImage(monitorBitmap); // standard background monitorGraphics.FillRectangle(SystemBrushes.Info, 0, 0, scaledScreen.UnscaledBounds.Width, scaledScreen.UnscaledBounds.Height); // todo: extension add different centering zoom options: fill, fill center if (desktopImage != null) { DrawImageFillCentered(ref monitorGraphics, desktopImage.Image, new Rectangle(0, 0, monitorBitmap.Width, monitorBitmap.Height)); } // add text to image Form controlerForm = null; if (controlerForms.ContainsKey(scaledScreen.DeviceName)) { controlerForm = controlerForms[scaledScreen.DeviceName]; } DrawLegenda(monitorGraphics, scaledScreen, desktopImage, controlerForm); // determine rectangle where the image will reside Rectangle screenRectangle = new Rectangle(scaledScreen.UnscaledBounds.X - ScaledScreen.DesktopRectangle.X, scaledScreen.UnscaledBounds.Y - ScaledScreen.DesktopRectangle.Y, scaledScreen.UnscaledBounds.Width, scaledScreen.UnscaledBounds.Height); // draw the image on the fill desktop image virtualScreenGraphic.DrawImage(monitorBitmap, screenRectangle); monitorGraphics.Dispose(); monitorBitmap.Dispose(); } virtualScreenBitmap.Save(WallpaperPath + defaultBackgroundFileName, ImageFormat.Bmp); virtualScreenGraphic.Dispose(); virtualScreenBitmap.Dispose(); } } SystemParametersInfo(SPI_SETDESKWALLPAPER, 0u, WallpaperPath + defaultBackgroundFileName, SPIF_UPDATEINIFILE); }
public static void CreateTestBackgroundImage() { var result = ScaledScreen.GetPerMonitorDPIAware(); if (result != ScaledScreen.PROCESS_DPI_AWARENESS.PROCESS_PER_MONITOR_DPI_AWARE) { ScaledScreen.SetPerMonitorDPIAware(); } ScaledScreen[] scaledScreens = ScaledScreen.AllScaledScreens; //using (var virtualScreenBitmap = new Bitmap(ScaledScreen.DesktopRectangle.Width, ScaledScreen.DesktopRectangle.Height)) using (var virtualScreenBitmap = CreateScreenBitmap(scaledScreens)) { using (var virtualScreenGraphic = Graphics.FromImage(virtualScreenBitmap)) { // for each screen foreach (var scaledScreen in scaledScreens) { // get drawing ground var monitorBitmap = new Bitmap(scaledScreen.Width, scaledScreen.Height); var monitorGraphics = Graphics.FromImage(monitorBitmap); // standard background monitorGraphics.FillRectangle(SystemBrushes.Desktop, 0, 0, monitorBitmap.Width, monitorBitmap.Height); // draw background cross Pen boundsCrossPen = new Pen(Color.Red, 4); monitorGraphics.DrawLine(boundsCrossPen, new Point( 0, 0), new Point( monitorBitmap.Width, monitorBitmap.Height)); monitorGraphics.DrawLine(boundsCrossPen, new Point( monitorBitmap.Width, 0), new Point( 0, monitorBitmap.Height)); // draw workarea cross Pen workareaCrossPen = new Pen(Color.Green, 4); monitorGraphics.DrawLine(workareaCrossPen, new Point( scaledScreen.UnscaledWorkingArea.X, scaledScreen.UnscaledWorkingArea.Y), new Point( scaledScreen.UnscaledWorkingArea.Width + scaledScreen.UnscaledWorkingArea.X, scaledScreen.UnscaledWorkingArea.Height + scaledScreen.UnscaledWorkingArea.Y)); monitorGraphics.DrawLine(workareaCrossPen, new Point( scaledScreen.UnscaledWorkingArea.Width + scaledScreen.UnscaledWorkingArea.X, scaledScreen.UnscaledWorkingArea.Y), new Point( scaledScreen.TaskbarLeftWidth, scaledScreen.UnscaledWorkingArea.Height + scaledScreen.UnscaledWorkingArea.Y)); // https://code.msdn.microsoft.com/DPI-Tutorial-sample-64134744/sourcecode?fileId=86763&pathId=1297537410 Font font = new Font(FontFamily.GenericSansSerif, (int)((float)10 * scaledScreen.Scale)); monitorGraphics.DrawString(scaledScreen.DeviceName, font, Brushes.LightBlue, new PointF(scaledScreen.TaskbarLeftWidth + 10 * scaledScreen.Scale, scaledScreen.TaskbarTopHeight + 10 * scaledScreen.Scale)); monitorGraphics.DrawString(scaledScreen.DeviceName, font, Brushes.LightGreen, new PointF(scaledScreen.TaskbarLeftWidth + scaledScreen.UnscaledWorkingArea.Width - 200 * scaledScreen.Scale, scaledScreen.TaskbarTopHeight + scaledScreen.UnscaledWorkingArea.Height - 50 * scaledScreen.Scale)); DrawTestLegenda(monitorGraphics, scaledScreen); Rectangle rectangle = new Rectangle(scaledScreen.UnscaledBounds.X - ScaledScreen.DesktopRectangle.X, scaledScreen.UnscaledBounds.Y - ScaledScreen.DesktopRectangle.Y, scaledScreen.UnscaledBounds.Width, scaledScreen.UnscaledBounds.Height); virtualScreenGraphic.DrawImage(monitorBitmap, rectangle); } virtualScreenBitmap.Save(WallpaperPath + defaultBackgroundFileName, ImageFormat.Bmp); } } SystemParametersInfo(SPI_SETDESKWALLPAPER, 0u, WallpaperPath + defaultBackgroundFileName, SPIF_UPDATEINIFILE); }
public static void CreateLogonScreenImage(DesktopImage desktopImage, string fullfilename) { var result = ScaledScreen.GetPerMonitorDPIAware(); if (result != ScaledScreen.PROCESS_DPI_AWARENESS.PROCESS_PER_MONITOR_DPI_AWARE) { ScaledScreen.SetPerMonitorDPIAware(); } ScaledScreen[] scaledScreens = ScaledScreen.AllScaledScreens; ScaledScreen scaledScreen = scaledScreens[0]; using (var virtualScreenBitmap = new Bitmap(ScaledScreen.DesktopRectangle.Width, ScaledScreen.DesktopRectangle.Height)) { using (var virtualScreenGraphic = Graphics.FromImage(virtualScreenBitmap)) { var monitorBitmap = new Bitmap(scaledScreen.UnscaledBounds.Width, scaledScreen.UnscaledBounds.Height); var monitorGraphics = Graphics.FromImage(monitorBitmap); // standard background monitorGraphics.FillRectangle(SystemBrushes.Info, 0, 0, scaledScreen.UnscaledBounds.Width, scaledScreen.UnscaledBounds.Height); // todo: extension add different centering zoom options: fill, fill center if (desktopImage != null) { DrawImageFillCentered(ref monitorGraphics, desktopImage.Image, new Rectangle(0, 0, monitorBitmap.Width, monitorBitmap.Height)); } // add text to image DrawLegenda(monitorGraphics, scaledScreen, desktopImage, null); // determine rectangle where the image will reside Rectangle screenRectangle = new Rectangle(scaledScreen.UnscaledBounds.X - ScaledScreen.DesktopRectangle.X, scaledScreen.UnscaledBounds.Y - ScaledScreen.DesktopRectangle.Y, scaledScreen.UnscaledBounds.Width, scaledScreen.UnscaledBounds.Height); // draw the image on the fill desktop image virtualScreenGraphic.DrawImage(monitorBitmap, screenRectangle); monitorGraphics.Dispose(); monitorBitmap.Dispose(); virtualScreenBitmap.Save(fullfilename, ImageFormat.Png); virtualScreenGraphic.Dispose(); virtualScreenBitmap.Dispose(); // https://docs.microsoft.com/en-us/uwp/api/Windows.System.UserProfile.LockScreen?view=winrt-18362 // https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/Personalization // Microsoft.Win32.SessionSwitchReason.SessionLock // http://omegacoder.com/?p=516 // registry: Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lock Screen // https://winaero.com/blog/find-the-current-lock-screen-image-file-in-windows-10/ // https://winaero.com/blog/find-the-current-lock-screen-image-file-in-windows-10/ //await LockScreen.SetImageFileAsync(imageFile); //System.UserProfile.LockScreen.SetImageFileAsync(File); } } //SystemParametersInfo(SPI_SETDESKWALLPAPER, 0u, WallpaperPath + defaultBackgroundFileName, SPIF_UPDATEINIFILE); }