예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }