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)); }
private static bool AeroEnabled() { bool aeroEnabled; WindowsApi.DwmIsCompositionEnabled(out aeroEnabled); return(aeroEnabled); }
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); } } }
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)); }
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)); }
private void FormClose(object sender, FormClosingEventArgs e) { foreach (var id in _windowId) { WindowsApi.UnregisterHotKey(Handle, id); } }
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); }
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); } }
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(); } } } }
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); }
private void RefreshButtonClick(object sender, EventArgs e) { _handleList.Clear(); windowList.Items.Clear(); _callBackPtr = ListWindows; WindowsApi.EnumWindows(_callBackPtr, (IntPtr)0); windowList.SelectedIndex = 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); }
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); }
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); }
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); }
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); } }
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)); }
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)); }
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); }
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; }
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); } }
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); } }
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); }