Ejemplo n.º 1
0
        private ScreenshotTask GetParamteresFromUI()
        {
            var type = ScreenshotTask.BackgroundType.Transparent;

            if (_settings.opaqueCheckbox && _settings.opaqueType == 0)
            {
                type = ScreenshotTask.BackgroundType.Checkerboard;
            }
            else if (_settings.opaqueCheckbox && _settings.opaqueType == 1)
            {
                type = ScreenshotTask.BackgroundType.SolidColor;
            }

            return
                (new ScreenshotTask(
                     WindowsApi.GetForegroundWindow(),
                     _settings.clipboardButton,
                     _settings.folderTextBox,
                     _settings.resizeCheckbox,
                     _settings.windowWidth,
                     _settings.windowHeight,
                     type,
                     Color.FromArgb(Convert.ToInt32("FF" + _settings.opaqueColorHexBox, 16)),
                     _settings.checkerValue,
                     _settings.aeroColorCheckbox,
                     Color.FromArgb(Convert.ToInt32("FF" + _settings.aeroColorHexBox, 16)),
                     _settings.mouseCheckbox,
                     _settings.clearTypeCheckbox,
                     _settings.shadowCheckbox));
        }
Ejemplo n.º 2
0
        private static bool AeroEnabled()
        {
            bool aeroEnabled;

            WindowsApi.DwmIsCompositionEnabled(out aeroEnabled);
            return(aeroEnabled);
        }
Ejemplo n.º 3
0
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if (m.Msg == WM_HOTKEY)
            {
                ScreenshotTask info = GetParamteresFromUI(true);
                _worker = new Thread(() => Screenshot.CaptureWindow(ref info))
                {
                    IsBackground = true
                };
                _worker.SetApartmentState(ApartmentState.STA);
                _worker.Start();
            }
            if (m.Msg == WM_DWMCOMPOSITIONCHANGED)
            {
                WindowsApi.DwmIsCompositionEnabled(ref _dwmComposited);

                if (_dwmComposited)
                {
                    ssButton.Location = new Point(ssButton.Location.X, 310);
                    var margin = new WindowsMargins(0, 0, 0, 35);
                    WindowsApi.DwmExtendFrameIntoClientArea(Handle, ref margin);
                }
                else
                {
                    ssButton.Location = new Point(ssButton.Location.X, 305);
                }
            }
        }
Ejemplo n.º 4
0
        private static Bitmap CaptureScreenRegion(Rectangle crop)
        {
            Rectangle totalSize = Rectangle.Empty;

            foreach (Screen s in Screen.AllScreens)
            {
                totalSize = Rectangle.Union(totalSize, s.Bounds);
            }

            IntPtr hSrc  = WindowsApi.CreateDC("DISPLAY", null, null, 0);
            IntPtr hDest = WindowsApi.CreateCompatibleDC(hSrc);
            IntPtr hBmp  = WindowsApi.CreateCompatibleBitmap(hSrc,
                                                             crop.Right -
                                                             crop.Left,
                                                             crop.Bottom -
                                                             crop.Top);
            IntPtr hOldBmp = WindowsApi.SelectObject(hDest, hBmp);

            WindowsApi.BitBlt(hDest, 0, 0, crop.Right - crop.Left,
                              crop.Bottom - crop.Top, hSrc, crop.Left, crop.Top,
                              CopyPixelOperation.SourceCopy |
                              CopyPixelOperation.CaptureBlt);
            Bitmap bmp = Image.FromHbitmap(hBmp);

            WindowsApi.SelectObject(hDest, hOldBmp);
            WindowsApi.DeleteObject(hBmp);
            WindowsApi.DeleteDC(hDest);
            WindowsApi.DeleteDC(hSrc);

            return(bmp.Clone(new Rectangle(0, 0, bmp.Width, bmp.Height),
                             PixelFormat.Format24bppRgb));
        }
Ejemplo n.º 5
0
 private ScreenshotTask GetParamteresFromUI()
 {
     return
         (new ScreenshotTask(
              WindowsApi.GetForegroundWindow(),
              _settings.clipboardButton,
              _settings.folderTextBox,
              _settings.resizeCheckbox,
              _settings.windowWidth,
              _settings.windowHeight,
              _settings.aeroColorCheckbox,
              Color.FromArgb(Convert.ToInt32("FF" + _settings.aeroColorHexBox, 16)),
              _settings.mouseCheckbox,
              _settings.clearTypeCheckbox,
              _settings.shadowCheckbox,
              _settings.saveActiveDarkCheckbox,
              _settings.saveActiveLightCheckbox,
              _settings.saveInactiveDarkCheckbox,
              _settings.saveInactiveLightCheckbox,
              _settings.saveMaskCheckbox,
              _settings.saveActiveTransparentCheckbox,
              _settings.saveInactiveTransparentCheckbox,
              _settings.canvasSizeCheckbox,
              _settings.canvasWidth,
              _settings.canvasHeight,
              _settings.cropModeKeepCenteredButton));
 }
Ejemplo n.º 6
0
 private void FormClose(object sender, FormClosingEventArgs e)
 {
     foreach (var id in _windowId)
     {
         WindowsApi.UnregisterHotKey(Handle, id);
     }
 }
Ejemplo n.º 7
0
        private bool ListWindows(IntPtr hWnd, int lParam)
        {
            if (!WindowsApi.IsWindowVisible(hWnd))
            {
                return(true);
            }
            if ((WindowsApi.GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_APPWINDOW) !=
                WS_EX_APPWINDOW)
            {
                if (WindowsApi.GetWindow(hWnd, GW_OWNER) != IntPtr.Zero)
                {
                    return(true);
                }
                if ((WindowsApi.GetWindowLong(hWnd, GWL_EXSTYLE) &
                     WS_EX_TOOLWINDOW) == WS_EX_TOOLWINDOW)
                {
                    return(true);
                }
                if ((WindowsApi.GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD) ==
                    WS_CHILD)
                {
                    return(true);
                }
            }

            int length = WindowsApi.GetWindowTextLength(hWnd);
            var sb     = new StringBuilder(length + 1);

            WindowsApi.GetWindowText(hWnd, sb, sb.Capacity);

            _handleList.Add(hWnd);
            windowList.Items.Add(sb.ToString());
            return(true);
        }
Ejemplo n.º 8
0
        private static void SmartResizeWindow(ref ScreenshotTask data, out WindowsRect oldWindowSize)
        {
            oldWindowSize = new WindowsRect(0);
            if ((WindowsApi.GetWindowLong(data.WindowHandle, GWL_STYLE) & WS_SIZEBOX) != WS_SIZEBOX)
            {
                return;
            }

            var r = new WindowsRect();

            WindowsApi.GetWindowRect(data.WindowHandle, ref r);
            oldWindowSize = r;

            Bitmap f = CaptureCompositeScreenshot(ref data);

            if (f != null)
            {
                WindowsApi.SetWindowPos(data.WindowHandle, (IntPtr)0, r.Left, r.Top, data.ResizeX - (f.Width - (r.Right - r.Left)), data.ResizeY - (f.Height - (r.Bottom - r.Top)), SWP_SHOWWINDOW);
                f.Dispose();
            }
            else
            {
                WindowsApi.SetWindowPos(data.WindowHandle, (IntPtr)0, r.Left, r.Top, data.ResizeX, data.ResizeY, SWP_SHOWWINDOW);
            }
        }
Ejemplo n.º 9
0
        private static void DrawCursorToBitmap(Bitmap windowImage, Point offsetLocation)
        {
            var ci = new CursorInfoStruct();

            ci.cbSize = Marshal.SizeOf(ci);
            if (WindowsApi.GetCursorInfo(out ci))
            {
                if (ci.flags == 1)
                {
                    IntPtr         hicon = WindowsApi.CopyIcon(ci.hCursor);
                    IconInfoStruct icInfo;
                    if (WindowsApi.GetIconInfo(hicon, out icInfo))
                    {
                        var    loc = new Point(ci.ptScreenPos.X - offsetLocation.X - icInfo.xHotspot, ci.ptScreenPos.Y - offsetLocation.Y - icInfo.yHotspot);
                        Icon   ic  = Icon.FromHandle(hicon);
                        Bitmap bmp = ic.ToBitmap();

                        Graphics g = Graphics.FromImage(windowImage);
                        g.DrawImage(bmp, new Rectangle(loc, bmp.Size));
                        g.Dispose();
                        WindowsApi.DestroyIcon(hicon);
                        bmp.Dispose();
                    }
                }
            }
        }
Ejemplo n.º 10
0
        public Hotkeys()
        {
            _windowId = new[] { GetHashCode(), GetHashCode() ^ 327 };
            WindowsApi.RegisterHotKey(Handle, _windowId[0], MOD_ALT, (int)Keys.PrintScreen);
            WindowsApi.RegisterHotKey(Handle, _windowId[1], MOD_ALT | MOD_CONTROL, (int)Keys.PrintScreen);

            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormClose);
        }
Ejemplo n.º 11
0
        private void RefreshButtonClick(object sender, EventArgs e)
        {
            _handleList.Clear();
            windowList.Items.Clear();

            _callBackPtr = ListWindows;
            WindowsApi.EnumWindows(_callBackPtr, (IntPtr)0);
            windowList.SelectedIndex = 0;
        }
Ejemplo n.º 12
0
        public Hotkeys()
        {
            _settings = new Settings();
            _windowId = new[] { GetHashCode(), GetHashCode() ^ 327 };
            WindowsApi.RegisterHotKey(Handle, _windowId[0], _settings.hotkeyModifier, _settings.hotkeyKey);
            //WindowsApi.RegisterHotKey(Handle, _windowId[1], MOD_ALT | MOD_CONTROL, (int)Keys.PrintScreen);

            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormClose);
        }
Ejemplo n.º 13
0
        private static bool GlassAvailable()
        {
            if (Environment.OSVersion.Version.Major >= 6 && Environment.OSVersion.Version.Minor > 1)
            {
                return(false);
            }

            bool aeroEnabled;

            WindowsApi.DwmIsCompositionEnabled(out aeroEnabled);
            return(aeroEnabled);
        }
Ejemplo n.º 14
0
        private void FormClose(object sender, FormClosingEventArgs e)
        {
            WindowsApi.UnregisterHotKey(Handle, _windowId);
            if (clipboardButton.Checked)
            {
                _registryKey.SetValue("LastPath", "*" + folderTextBox.Text);
            }
            else
            {
                _registryKey.SetValue("LastPath", folderTextBox.Text);
            }

            // Save resizing settings in an 8-byte long
            var b = new byte[8];

            b[0] = (byte)(resizeCheckbox.Checked ? 1 : 0);

            b[3] = (byte)((int)windowWidth.Value & 0xff);
            b[2] = (byte)(((int)windowWidth.Value >> 8) & 0xff);
            b[1] = (byte)(((int)windowWidth.Value >> 16) & 0xff);

            b[6] = (byte)((int)windowHeight.Value & 0xff);
            b[5] = (byte)(((int)windowHeight.Value >> 8) & 0xff);
            b[4] = (byte)(((int)windowHeight.Value >> 16) & 0xff);

            long data = BitConverter.ToInt64(b, 0);

            _registryKey.SetValue("WindowSize", data, RegistryValueKind.QWord);

            // Save background colour settings in an 8-byte long
            b     = new byte[8];
            b[0]  = (byte)(opaqueCheckbox.Checked ? 1 : 0);
            b[0] += (byte)Math.Pow(2, opaqueType.SelectedIndex + 1);

            b[1] = (byte)(checkerValue.Value - 2);

            b[2] = colourDialog.Color.R;
            b[3] = colourDialog.Color.G;
            b[4] = colourDialog.Color.B;

            data = BitConverter.ToInt64(b, 0);
            _registryKey.SetValue("Opaque", data, RegistryValueKind.QWord);

            _registryKey.SetValue("CapturePointer",
                                  mouseCheckbox.Checked ? 1 : 0,
                                  RegistryValueKind.DWord);
        }
Ejemplo n.º 15
0
        private static bool GlassAvailable()
        {
            if ((Environment.OSVersion.Version.Major >= 6 && Environment.OSVersion.Version.Minor > 1) || Environment.OSVersion.Version.Major >= 10 || Environment.OSVersion.Version.Major < 6)
            {
                return(false);
            }

            bool aeroEnabled = true;

            try {
                WindowsApi.DwmIsCompositionEnabled(out aeroEnabled);
            }
            catch (Exception)
            {
                //This is fallback intended for beta versions of Windows Vista
            }
            return(aeroEnabled);
        }
Ejemplo n.º 16
0
        private static bool ClearTypeEnabled()
        {
            int sv = 0;

            /* Call to systemparametersinfo to get the font smoothing value. */
            WindowsApi.SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, ref sv, 0);

            int stv = 0;

            /* Call to systemparametersinfo to get the font smoothing Type value. */
            WindowsApi.SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, ref stv, 0);

            if (sv > 0 && stv == 2) //if smoothing is on, and is set to cleartype
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Ejemplo n.º 17
0
 private void OnPaint(object sender, PaintEventArgs e)
 {
     if (_dwmComposited)
     {
         var rc = new Rectangle(0, ClientSize.Height - 35,
                                ClientSize.Width, 35);
         IntPtr destdc    = e.Graphics.GetHdc();
         IntPtr memdc     = WindowsApi.CreateCompatibleDC(destdc);
         IntPtr bitmapOld = IntPtr.Zero;
         var    dib       = new BitmapInfo {
             biHeight      = -(rc.Bottom - rc.Top),
             biWidth       = rc.Right - rc.Left,
             biPlanes      = 1,
             biSize        = Marshal.SizeOf(typeof(BitmapInfo)),
             biBitCount    = 32,
             biCompression = 0
         };
         if (WindowsApi.SaveDC(memdc) != 0)
         {
             IntPtr tmp;
             IntPtr bitmap = WindowsApi.CreateDIBSection(memdc, ref dib,
                                                         0, out tmp,
                                                         IntPtr.Zero, 0);
             if (!(bitmap == IntPtr.Zero))
             {
                 bitmapOld = WindowsApi.SelectObject(memdc, bitmap);
                 WindowsApi.BitBlt(destdc, rc.Left, rc.Top,
                                   rc.Right - rc.Left, rc.Bottom - rc.Top,
                                   memdc, 0, 0,
                                   CopyPixelOperation.SourceCopy);
             }
             WindowsApi.SelectObject(memdc, bitmapOld);
             WindowsApi.DeleteObject(bitmap);
             WindowsApi.DeleteDC(memdc);
         }
         e.Graphics.ReleaseHdc(destdc);
     }
     e.Graphics.DrawImage(_ssButtonImage,
                          new Rectangle(ssButton.Location, ssButton.Size));
 }
Ejemplo n.º 18
0
        private ScreenshotTask GetParamteresFromUI(bool useForegroundWindow)
        {
            var type = ScreenshotTask.BackgroundType.Transparent;

            if (opaqueCheckbox.Checked && opaqueType.SelectedIndex == 0)
            {
                type = ScreenshotTask.BackgroundType.Checkerboard;
            }
            else if (opaqueCheckbox.Checked && opaqueType.SelectedIndex == 1)
            {
                type = ScreenshotTask.BackgroundType.SolidColour;
            }

            return
                (new ScreenshotTask(
                     useForegroundWindow
                        ? WindowsApi.GetForegroundWindow()
                        : _handleList[windowList.SelectedIndex],
                     clipboardButton.Checked, folderTextBox.Text,
                     resizeCheckbox.Checked, (int)windowWidth.Value,
                     (int)windowHeight.Value, type, colourDialog.Color,
                     (int)checkerValue.Value,
                     useForegroundWindow && mouseCheckbox.Checked));
        }
Ejemplo n.º 19
0
        private static unsafe Bitmap[] CaptureCompositeScreenshot(ref ScreenshotTask data)
        {
            // Generate a rectangle with the size of all monitors combined
            Rectangle totalSize = Rectangle.Empty;

            foreach (Screen s in Screen.AllScreens)
            {
                totalSize = Rectangle.Union(totalSize, s.Bounds);
            }

            var rct = new WindowsRect();

            if (WindowsApi.DwmGetWindowAttribute(data.WindowHandle, DwmWindowAttribute.ExtendedFrameBounds, ref rct, sizeof(WindowsRect)) != 0)
            {
                // DwmGetWindowAttribute() failed, usually means Aero is disabled so we fall back to GetWindowRect()
                WindowsApi.GetWindowRect(data.WindowHandle, ref rct);
            }
            else
            {
                // DwmGetWindowAttribute() succeeded
            }

            // Get DPI of the window (this only works properly on Win 10 1607+) but it is not really needed until Win 11 anyway
            int DPI = 96;

            try
            {
                DPI = WindowsApi.GetDpiForWindow(data.WindowHandle);
            }
            catch { }

            // Adjust margin for DPI
            double scalingFactor  = DPI / 96;
            int    backdropOffset = Convert.ToInt32(100 * scalingFactor);

            // Add a 100px margin for window shadows. Excess transparency is trimmed out later
            rct.Left   -= backdropOffset;
            rct.Right  += backdropOffset;
            rct.Top    -= backdropOffset;
            rct.Bottom += backdropOffset;

            // These next 4 checks handle if the window is outside of the visible screen
            if (rct.Left < totalSize.Left)
            {
                rct.Left = totalSize.Left;
            }
            if (rct.Right > totalSize.Right)
            {
                rct.Right = totalSize.Right;
            }
            if (rct.Top < totalSize.Top)
            {
                rct.Top = totalSize.Top;
            }
            if (rct.Bottom > totalSize.Bottom)
            {
                rct.Bottom = totalSize.Bottom;
            }

            // Spawning backdrop
            // Handling as much as possible in the constructor makes this easier to render, which makes capture less likely to fail on underpowered PCs
            Color tmpColor = Color.White;
            var   backdrop = new Form
            {
                BackColor       = tmpColor,
                FormBorderStyle = FormBorderStyle.None,
                ShowInTaskbar   = false,
                //Opacity = 0,
                Size          = new Size(rct.Right - rct.Left, rct.Bottom - rct.Top),
                StartPosition = FormStartPosition.Manual,
                Location      = new Point(rct.Left, rct.Top)
            };

            WindowsApi.ShowWindow(backdrop.Handle, 4);
            if (!WindowsApi.SetWindowPos(backdrop.Handle, data.WindowHandle, rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top, SWP_NOACTIVATE))
            {
                // We are unable to put backdrop directly behind the window, so we will put it into the foreground and then put the original window on top of it
                // This likely happens because the program we're trying to capture is running as administrator
                WindowsApi.SetWindowPos(backdrop.Handle, IntPtr.Zero, rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top, SWP_NOACTIVATE);
                WindowsApi.SetForegroundWindow(data.WindowHandle).ToString();
            }

            RefreshBackdrop();

            // Capture screenshot with white background
            Bitmap whiteShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));

            backdrop.BackColor = Color.Black;
            RefreshBackdrop();

            // Capture screenshot with black background
            Bitmap blackShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));

            Bitmap transparentImage;
            Bitmap transparentInactiveImage            = null;
            Bitmap transparentWhiteImage               = null;
            Bitmap transparentWhiteInactiveImage       = null;
            Bitmap transparentMaskImage                = null;
            Bitmap transparentTransparentImage         = null;
            Bitmap transparentTransparentInactiveImage = null;

            transparentImage = DifferentiateAlpha(whiteShot, blackShot, false);
            if (data.SaveActiveLight)
            {
                transparentWhiteImage = DifferentiateAlpha(whiteShot, blackShot, true);
            }

            whiteShot.Dispose();
            blackShot.Dispose();

            //Capture black mask screenshot
            if (data.SaveMask)
            {
                int  minAlpha      = 0;
                bool isCompositing = false;
                bool ShadowToggled = false;
                bool ColorToggled  = false;

                try
                {
                    WindowsApi.DwmIsCompositionEnabled(out isCompositing);
                }
                catch (Exception)
                {
                    //OS doesn't have a supported version of DWM
                }

                //We can't disable shadows on Vista without disabling DWM, which would cause the mask to be inaccurate
                UInt32 ColorizationColor = 0;
                bool   fOpaque           = true;
                if (isCompositing && (VersionHelpers.IsWindowsVista() || VersionHelpers.IsWindows11()))
                {
                    minAlpha = 254;

                    WindowsApi.DwmGetColorizationColor(out ColorizationColor, out fOpaque);

                    if (fOpaque == false)
                    {
                        WindowsApi.DwmpSetColorization(ColorizationColor, true, 0xFF);
                        ColorToggled = true;
                    }
                }
                else if (ShadowEnabled())
                {
                    WindowsApi.SystemParametersInfo(SPI_SETDROPSHADOW, 0, false, 0);
                    ShadowToggled = true;
                }

                backdrop.BackColor = Color.White;
                RefreshBackdrop();
                Bitmap whiteMaskShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));

                backdrop.BackColor = Color.Black;
                RefreshBackdrop();
                Bitmap blackMaskShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));

                transparentMaskImage = CreateMask(DifferentiateAlpha(whiteMaskShot, blackMaskShot, false), minAlpha);

                if (ShadowToggled)
                {
                    WindowsApi.SystemParametersInfo(SPI_SETDROPSHADOW, 0, true, 0);
                }

                if (ColorToggled)
                {
                    WindowsApi.DwmpSetColorization(ColorizationColor, fOpaque, 0xFF);
                }

                whiteMaskShot.Dispose();
                blackMaskShot.Dispose();
            }

            //Capture active fully transparent
            if (data.SaveActiveTransparent)
            {
                try
                {
                    //win 7
                    WindowsApi.DWM_COLORIZATION_PARAMS parameters, originalParameters = new WindowsApi.DWM_COLORIZATION_PARAMS();
                    //win vista
                    UInt32 ColorizationColor = 0;
                    bool   fOpaque           = true;


                    if (VersionHelpers.IsWindowsVista())
                    {
                        WindowsApi.DwmGetColorizationColor(out ColorizationColor, out fOpaque);

                        if (fOpaque == false)
                        {
                            WindowsApi.DwmpSetColorization(0xFFFFFF, false, 0xFF);
                        }
                    }
                    else
                    {
                        WindowsApi.DwmGetColorizationParameters(out parameters);
                        WindowsApi.DwmGetColorizationParameters(out originalParameters);

                        //Set custom fully transparent parameters
                        parameters.clrAfterGlowBalance = 0;
                        parameters.clrBlurBalance      = 100;
                        parameters.nIntensity          = 0;

                        // Call the DwmSetColorizationParameters to make the change take effect.
                        WindowsApi.DwmSetColorizationParameters(ref parameters, false);
                    }


                    backdrop.BackColor = Color.White;
                    RefreshBackdrop();
                    Bitmap whiteTransparentShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));

                    backdrop.BackColor = Color.Black;
                    RefreshBackdrop();
                    Bitmap blackTransparentShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));

                    transparentTransparentImage = DifferentiateAlpha(whiteTransparentShot, blackTransparentShot, false);
                    whiteTransparentShot.Dispose();
                    blackTransparentShot.Dispose();

                    if (VersionHelpers.IsWindowsVista())
                    {
                        WindowsApi.DwmpSetColorization(ColorizationColor, fOpaque, 0xFF);
                    }
                    else
                    {
                        WindowsApi.DwmSetColorizationParameters(ref originalParameters, false);
                    }
                }
                catch (Exception)
                {
                    transparentTransparentImage = new Bitmap(transparentImage);
                }
            }

            //Show form to steal focus
            var emptyForm = new Form
            {
                FormBorderStyle = FormBorderStyle.None,
                ShowInTaskbar   = false,
                Opacity         = 0,
            };

            WindowsApi.ShowWindow(emptyForm.Handle, 5);
            WindowsApi.SetWindowPos(emptyForm.Handle, data.WindowHandle, rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top, 0);
            WindowsApi.SetForegroundWindow(emptyForm.Handle);

            // Capture inactive screenshots
            if (data.SaveInactiveDark || data.SaveInactiveLight)
            {
                backdrop.BackColor = Color.White;
                RefreshBackdrop();

                // Capture inactive screenshot with white background
                Bitmap whiteInactiveShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));

                backdrop.BackColor = Color.Black;
                RefreshBackdrop();

                // Capture inactive screenshot with black background
                Bitmap blackInactiveShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));


                if (data.SaveInactiveDark)
                {
                    transparentInactiveImage = DifferentiateAlpha(whiteInactiveShot, blackInactiveShot, false);
                }
                if (data.SaveInactiveLight)
                {
                    transparentWhiteInactiveImage = DifferentiateAlpha(whiteInactiveShot, blackInactiveShot, true);
                }

                whiteInactiveShot.Dispose();
                blackInactiveShot.Dispose();
            }

            //Capture inactive fully transparent
            if (data.SaveInactiveTransparent)
            {
                try
                {
                    //Get original colorization parameters
                    WindowsApi.DWM_COLORIZATION_PARAMS parameters, originalParameters;
                    WindowsApi.DwmGetColorizationParameters(out parameters);
                    WindowsApi.DwmGetColorizationParameters(out originalParameters);

                    //Set custom fully transparent parameters
                    parameters.clrAfterGlowBalance = 0;
                    parameters.clrBlurBalance      = 100;
                    parameters.nIntensity          = 0;

                    // Call the DwmSetColorizationParameters to make the change take effect.
                    WindowsApi.DwmSetColorizationParameters(ref parameters, false);

                    backdrop.BackColor = Color.White;
                    RefreshBackdrop();
                    Bitmap whiteTransparentInactiveShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));

                    backdrop.BackColor = Color.Black;
                    RefreshBackdrop();
                    Bitmap blackTransparentInactiveShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));

                    transparentTransparentInactiveImage = DifferentiateAlpha(whiteTransparentInactiveShot, blackTransparentInactiveShot, false);
                    whiteTransparentInactiveShot.Dispose();
                    blackTransparentInactiveShot.Dispose();

                    WindowsApi.DwmSetColorizationParameters(ref originalParameters, false);
                }
                catch (Exception)
                {
                    transparentTransparentInactiveImage = new Bitmap(transparentInactiveImage);
                }
            }

            backdrop.Dispose();
            emptyForm.Dispose();

            if (data.CaptureMouse)
            {
                DrawCursorToBitmap(transparentImage, new Point(rct.Left, rct.Top));
            }
            Bitmap[] final = CropEmptyEdges(new[] { transparentImage, transparentInactiveImage, transparentWhiteImage, transparentWhiteInactiveImage, transparentMaskImage, transparentTransparentImage, transparentTransparentInactiveImage }, Color.FromArgb(0, 0, 0, 0), ref data);

            // Returns a bitmap with transparency, calculated by differentiating the white and black screenshots
            return(final);
        }
Ejemplo n.º 20
0
        public MainForm()
        {
            DoubleBuffered = true;
            Icon           = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
            InitializeComponent();

            if (WindowsApi.DwmIsCompositionEnabled(ref _dwmComposited) == 0)
            {
                if (_dwmComposited)
                {
                    ssButton.Location = new Point(ssButton.Location.X, 310);
                    var margin = new WindowsMargins(0, 0, 0, 35);
                    WindowsApi.DwmExtendFrameIntoClientArea(Handle, ref margin);
                }
            }

            _windowId = GetHashCode();
            WindowsApi.RegisterHotKey(Handle, _windowId, MOD_ALT,
                                      (int)Keys.PrintScreen);

            object value;

            _registryKey =
                Registry.CurrentUser.CreateSubKey(@"Software\AeroShot");
            if ((value = _registryKey.GetValue("LastPath")) != null &&
                value.GetType() == (typeof(string)))
            {
                if (((string)value).Substring(0, 1) == "*")
                {
                    folderTextBox.Text      = ((string)value).Substring(1);
                    clipboardButton.Checked = true;
                }
                else
                {
                    folderTextBox.Text = (string)value;
                    diskButton.Checked = true;
                }
            }
            else
            {
                folderTextBox.Text =
                    Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            }

            if ((value = _registryKey.GetValue("WindowSize")) != null &&
                value.GetType() == (typeof(long)))
            {
                var b = new byte[8];
                for (int i = 0; i < 8; i++)
                {
                    b[i] = (byte)(((long)value >> (i * 8)) & 0xff);
                }
                resizeCheckbox.Checked = (b[0] & 1) == 1;
                windowWidth.Value      = b[1] << 16 | b[2] << 8 | b[3];
                windowHeight.Value     = b[4] << 16 | b[5] << 8 | b[6];
            }

            if ((value = _registryKey.GetValue("Opaque")) != null &&
                value.GetType() == (typeof(long)))
            {
                var b = new byte[8];
                for (int i = 0; i < 8; i++)
                {
                    b[i] = (byte)(((long)value >> (i * 8)) & 0xff);
                }
                opaqueCheckbox.Checked = (b[0] & 1) == 1;
                if ((b[0] & 2) == 2)
                {
                    opaqueType.SelectedIndex = 0;
                }
                if ((b[0] & 4) == 4)
                {
                    opaqueType.SelectedIndex = 1;
                }

                checkerValue.Value = b[1] + 2;

                var hex = new StringBuilder(6);
                hex.AppendFormat("{0:X2}", b[2]);
                hex.AppendFormat("{0:X2}", b[3]);
                hex.AppendFormat("{0:X2}", b[4]);
                colourHexBox.Text = hex.ToString();
            }
            else
            {
                opaqueType.SelectedIndex = 0;
            }
            if ((value = _registryKey.GetValue("CapturePointer")) != null &&
                value.GetType() == (typeof(int)))
            {
                mouseCheckbox.Checked = ((int)value & 1) == 1;
            }

            groupBox1.Enabled = resizeCheckbox.Checked;
            groupBox2.Enabled = opaqueCheckbox.Checked;
            groupBox3.Enabled = mouseCheckbox.Checked;

            _ssButtonImage = Resources.capture;
        }
Ejemplo n.º 21
0
        internal static void CaptureWindow(ref ScreenshotTask data)
        {
            IntPtr start   = WindowsApi.FindWindow("Button", "Start");
            IntPtr taskbar = WindowsApi.FindWindow("Shell_TrayWnd", null);

            if (data.ClipboardNotDisk || Directory.Exists(data.DiskSaveDirectory))
            {
                try
                {
                    // Hide the taskbar, just incase it gets in the way
                    if (data.WindowHandle != start &&
                        data.WindowHandle != taskbar)
                    {
                        WindowsApi.ShowWindow(start, 0);
                        WindowsApi.ShowWindow(taskbar, 0);
                        Application.DoEvents();
                    }
                    bool ClearTypeToggled = false;
                    if (data.DisableClearType && ClearTypeEnabled())
                    {
                        WindowsApi.SystemParametersInfo(SPI_SETFONTSMOOTHINGTYPE, 0, FE_FONTSMOOTHINGSTANDARD, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
                        WindowsApi.RedrawWindow(data.WindowHandle, IntPtr.Zero, IntPtr.Zero, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
                        ClearTypeToggled = true;
                    }
                    WindowsApi.SetForegroundWindow(data.WindowHandle);

                    bool AeroColorToggled = false;
                    WindowsApi.DWM_COLORIZATION_PARAMS originalParameters;
                    WindowsApi.DwmGetColorizationParameters(out originalParameters);
                    if (data.CustomGlass && AeroEnabled())
                    {
                        // Original colorization parameters
                        originalParameters.clrGlassReflectionIntensity = 50;

                        // Custom colorization parameters
                        WindowsApi.DWM_COLORIZATION_PARAMS parameters;
                        WindowsApi.DwmGetColorizationParameters(out parameters);
                        parameters.clrAfterGlowBalance = 2;
                        parameters.clrBlurBalance      = 29;
                        parameters.clrColor            = ColorToBgra(data.AeroColor);
                        parameters.nIntensity          = 69;

                        // Call the DwmSetColorizationParameters to make the change take effect.
                        WindowsApi.DwmSetColorizationParameters(ref parameters, false);
                        AeroColorToggled = true;
                    }

                    bool ShadowToggled = false;
                    if (data.DisableShadow && ShadowEnabled())
                    {
                        WindowsApi.SystemParametersInfo(SPI_SETDROPSHADOW, 0, false, 0);
                        ShadowToggled = true;
                    }

                    var r = new WindowsRect(0);
                    if (data.DoResize)
                    {
                        SmartResizeWindow(ref data, out r);
                        Thread.Sleep(100);
                    }

                    int length = WindowsApi.GetWindowTextLength(data.WindowHandle);
                    var sb     = new StringBuilder(length + 1);
                    WindowsApi.GetWindowText(data.WindowHandle, sb, sb.Capacity);

                    string name = sb.ToString();

                    foreach (char inv in Path.GetInvalidFileNameChars())
                    {
                        name = name.Replace(inv.ToString(), string.Empty);
                    }

                    Bitmap s = CaptureCompositeScreenshot(ref data);

                    if (AeroColorToggled)
                    {
                        WindowsApi.DwmSetColorizationParameters(ref originalParameters, false);
                    }

                    if (ClearTypeToggled)
                    {
                        WindowsApi.SystemParametersInfo(SPI_SETFONTSMOOTHINGTYPE, 0, FE_FONTSMOOTHINGCLEARTYPE, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
                        WindowsApi.RedrawWindow(data.WindowHandle, IntPtr.Zero, IntPtr.Zero, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
                    }

                    if (ShadowToggled)
                    {
                        WindowsApi.SystemParametersInfo(SPI_SETDROPSHADOW, 0, true, 0);
                    }

                    // Show the taskbar again
                    if (data.WindowHandle != start &&
                        data.WindowHandle != taskbar)
                    {
                        WindowsApi.ShowWindow(start, 1);
                        WindowsApi.ShowWindow(taskbar, 1);
                    }

                    if (s == null)
                    {
                        MessageBox.Show("The screenshot taken was blank, it will not be saved.",
                                        "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                    else
                    {
                        if (data.ClipboardNotDisk && data.Background !=
                            ScreenshotTask.BackgroundType.Transparent)
                        {
                            // Screenshot is already opaque, don't need to modify it
                            Clipboard.SetImage(s);
                        }
                        else if (data.ClipboardNotDisk)
                        {
                            var whiteS = new Bitmap(s.Width, s.Height, PixelFormat.Format24bppRgb);
                            using (Graphics graphics = Graphics.FromImage(whiteS))
                            {
                                graphics.Clear(Color.White);
                                graphics.DrawImage(s, 0, 0, s.Width, s.Height);
                            }
                            using (var stream = new MemoryStream())
                            {
                                // Save screenshot in clipboard as PNG which some applications support (eg. Microsoft Office)
                                s.Save(stream, ImageFormat.Png);
                                var pngClipboardData = new DataObject("PNG", stream);

                                // Add fallback for applications that don't support PNG from clipboard (eg. Photoshop or Paint)
                                pngClipboardData.SetData(DataFormats.Bitmap, whiteS);
                                Clipboard.Clear();
                                Clipboard.SetDataObject(pngClipboardData, true);
                            }
                            whiteS.Dispose();
                        }
                        else
                        {
                            name = name.Trim();
                            if (name == string.Empty)
                            {
                                name = "AeroShot";
                            }
                            string path = Path.Combine(data.DiskSaveDirectory, name + ".png");

                            if (File.Exists(path))
                            {
                                for (int i = 1; i < 9999; i++)
                                {
                                    path = Path.Combine(data.DiskSaveDirectory, name + " " + i + ".png");
                                    if (!File.Exists(path))
                                    {
                                        break;
                                    }
                                }
                            }
                            s.Save(path, ImageFormat.Png);
                        }
                        s.Dispose();
                    }

                    if (data.DoResize)
                    {
                        if ((WindowsApi.GetWindowLong(data.WindowHandle, GWL_STYLE) & WS_SIZEBOX) == WS_SIZEBOX)
                        {
                            WindowsApi.SetWindowPos(data.WindowHandle, (IntPtr)0, r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top, SWP_SHOWWINDOW);
                        }
                    }
                }
                catch (Exception)
                {
                    if (data.WindowHandle != start && data.WindowHandle != taskbar)
                    {
                        WindowsApi.ShowWindow(start, 1);
                        WindowsApi.ShowWindow(taskbar, 1);
                    }
                    MessageBox.Show("An error occurred while trying to take a screenshot.\r\n\r\nPlease make sure you have selected a valid window.",
                                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("Invalid directory chosen.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Ejemplo n.º 22
0
        internal static void CaptureWindow(ref ScreenshotTask data)
        {
            IntPtr start   = WindowsApi.FindWindow("Button", "Start");
            IntPtr taskbar = WindowsApi.FindWindow("Shell_TrayWnd", null);

            if (data.ClipboardNotDisk ||
                Directory.Exists(data.DiskSaveDirectory))
            {
                try {
                    // Hide the taskbar, just incase it gets in the way
                    if (data.WindowHandle != start &&
                        data.WindowHandle != taskbar)
                    {
                        WindowsApi.ShowWindow(start, 0);
                        WindowsApi.ShowWindow(taskbar, 0);
                        Application.DoEvents();
                    }
                    if (WindowsApi.IsIconic(data.WindowHandle))
                    {
                        WindowsApi.ShowWindow(data.WindowHandle, 1);
                        Thread.Sleep(300); // Wait for window to be restored
                    }
                    else
                    {
                        WindowsApi.ShowWindow(data.WindowHandle, 5);
                        Thread.Sleep(100);
                    }
                    WindowsApi.SetForegroundWindow(data.WindowHandle);

                    var r = new WindowsRect(0);
                    if (data.DoResize)
                    {
                        SmartResizeWindow(ref data, out r);
                        Thread.Sleep(100);
                    }

                    int length =
                        WindowsApi.GetWindowTextLength(data.WindowHandle);
                    var sb = new StringBuilder(length + 1);
                    WindowsApi.GetWindowText(data.WindowHandle, sb, sb.Capacity);

                    string name = sb.ToString();

                    foreach (char inv in Path.GetInvalidFileNameChars())
                    {
                        name = name.Replace(inv.ToString(), string.Empty);
                    }

                    Bitmap s = CaptureCompositeScreenshot(ref data);

                    // Show the taskbar again
                    if (data.WindowHandle != start &&
                        data.WindowHandle != taskbar)
                    {
                        WindowsApi.ShowWindow(start, 1);
                        WindowsApi.ShowWindow(taskbar, 1);
                    }

                    if (s == null)
                    {
                        MessageBox.Show(
                            "The screenshot taken was blank, it will not be saved.",
                            "Warning", MessageBoxButtons.OK,
                            MessageBoxIcon.Warning);
                    }
                    else
                    {
                        if (data.ClipboardNotDisk &&
                            data.Background !=
                            ScreenshotTask.BackgroundType.Transparent)
                        {
                            // Screenshot is already opaque, don't need to modify it
                            Clipboard.SetImage(s);
                        }
                        else if (data.ClipboardNotDisk)
                        {
                            var whiteS = new Bitmap(s.Width, s.Height,
                                                    PixelFormat.Format24bppRgb);
                            using (
                                Graphics graphics = Graphics.FromImage(whiteS)) {
                                graphics.Clear(Color.White);
                                graphics.DrawImage(s, 0, 0, s.Width, s.Height);
                            }
                            using (var stream = new MemoryStream()) {
                                // Save screenshot in clipboard as PNG which some applications support (eg. Microsoft Office)
                                s.Save(stream, ImageFormat.Png);
                                var pngClipboardData = new DataObject("PNG",
                                                                      stream);

                                // Add fallback for applications that don't support PNG from clipboard (eg. Photoshop or Paint)
                                pngClipboardData.SetData(DataFormats.Bitmap,
                                                         whiteS);
                                Clipboard.Clear();
                                Clipboard.SetDataObject(pngClipboardData, true);
                            }
                            whiteS.Dispose();
                        }
                        else
                        {
                            name = name.Trim();
                            if (name == string.Empty)
                            {
                                name = "AeroShot";
                            }
                            string path = Path.Combine(data.DiskSaveDirectory,
                                                       name + ".png");

                            if (File.Exists(path))
                            {
                                for (int i = 1; i < 9999; i++)
                                {
                                    path = Path.Combine(data.DiskSaveDirectory,
                                                        name + " " + i + ".png");
                                    if (!File.Exists(path))
                                    {
                                        break;
                                    }
                                }
                            }
                            s.Save(path, ImageFormat.Png);
                        }
                        s.Dispose();
                    }

                    if (data.DoResize)
                    {
                        if (
                            (WindowsApi.GetWindowLong(data.WindowHandle,
                                                      GWL_STYLE) & WS_SIZEBOX) ==
                            WS_SIZEBOX)
                        {
                            WindowsApi.SetWindowPos(data.WindowHandle,
                                                    (IntPtr)0, r.Left, r.Top,
                                                    r.Right - r.Left,
                                                    r.Bottom - r.Top,
                                                    SWP_SHOWWINDOW);
                        }
                    }
                } catch (Exception) {
                    if (data.WindowHandle != start &&
                        data.WindowHandle != taskbar)
                    {
                        WindowsApi.ShowWindow(start, 1);
                        WindowsApi.ShowWindow(taskbar, 1);
                    }
                    MessageBox.Show(
                        "An error occurred while trying to take a screenshot.\r\n\r\nPlease make sure you have selected a valid window.",
                        "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("Invalid directory chosen.", "Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Ejemplo n.º 23
0
        private static unsafe Bitmap CaptureCompositeScreenshot(ref ScreenshotTask data)
        {
            Color tmpColor = data.BackgroundColor;

            if (data.Background == ScreenshotTask.BackgroundType.Transparent ||
                data.Background == ScreenshotTask.BackgroundType.Checkerboard)
            {
                tmpColor = Color.White;
            }
            var backdrop = new Form
            {
                BackColor       = tmpColor,
                FormBorderStyle = FormBorderStyle.None,
                ShowInTaskbar   = false,
                Opacity         = 0
            };

            // Generate a rectangle with the size of all monitors combined
            Rectangle totalSize = Rectangle.Empty;

            foreach (Screen s in Screen.AllScreens)
            {
                totalSize = Rectangle.Union(totalSize, s.Bounds);
            }

            var rct = new WindowsRect();

            if (WindowsApi.DwmGetWindowAttribute(data.WindowHandle, DwmWindowAttribute.ExtendedFrameBounds, ref rct, sizeof(WindowsRect)) != 0)
            {
                // DwmGetWindowAttribute() failed, usually means Aero is disabled so we fall back to GetWindowRect()
                WindowsApi.GetWindowRect(data.WindowHandle, ref rct);
            }
            else
            {
                // DwmGetWindowAttribute() succeeded
                // Add a 100px margin for window shadows. Excess transparency is trimmed out later
                rct.Left   -= 100;
                rct.Right  += 100;
                rct.Top    -= 100;
                rct.Bottom += 100;
            }

            // These next 4 checks handle if the window is outside of the visible screen
            if (rct.Left < totalSize.Left)
            {
                rct.Left = totalSize.Left;
            }
            if (rct.Right > totalSize.Right)
            {
                rct.Right = totalSize.Right;
            }
            if (rct.Top < totalSize.Top)
            {
                rct.Top = totalSize.Top;
            }
            if (rct.Bottom > totalSize.Bottom)
            {
                rct.Bottom = totalSize.Bottom;
            }

            WindowsApi.ShowWindow(backdrop.Handle, 4);
            WindowsApi.SetWindowPos(backdrop.Handle, data.WindowHandle, rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top, SWP_NOACTIVATE);
            backdrop.Opacity = 1;
            Application.DoEvents();

            // Capture screenshot with white background
            Bitmap whiteShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));

            if (data.Background == ScreenshotTask.BackgroundType.SolidColor)
            {
                backdrop.Dispose();
                if (data.CaptureMouse)
                {
                    DrawCursorToBitmap(whiteShot, new Point(rct.Left, rct.Top));
                }
                Bitmap final = CropEmptyEdges(whiteShot, tmpColor);
                whiteShot.Dispose();
                return(final);
            }

            backdrop.BackColor = Color.Black;
            Application.DoEvents();

            // Capture screenshot with black background
            Bitmap blackShot = CaptureScreenRegion(new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top));

            backdrop.Dispose();

            Bitmap transparentImage = DifferentiateAlpha(whiteShot, blackShot);

            if (data.CaptureMouse)
            {
                DrawCursorToBitmap(transparentImage, new Point(rct.Left, rct.Top));
            }
            transparentImage = CropEmptyEdges(transparentImage, Color.FromArgb(0, 0, 0, 0));

            whiteShot.Dispose();
            blackShot.Dispose();

            if (data.Background == ScreenshotTask.BackgroundType.Checkerboard)
            {
                var      final         = new Bitmap(transparentImage.Width, transparentImage.Height, PixelFormat.Format24bppRgb);
                Graphics finalGraphics = Graphics.FromImage(final);
                var      brush         = new TextureBrush(GenerateChecker(data.CheckerboardSize));
                finalGraphics.FillRectangle(brush, finalGraphics.ClipBounds);
                finalGraphics.DrawImageUnscaled(transparentImage, 0, 0);
                finalGraphics.Dispose();
                transparentImage.Dispose();
                return(final);
            }
            // Returns a bitmap with transparency, calculated by differentiating the white and black screenshots
            return(transparentImage);
        }