private void AddDefaultScreens(ScreenCapture screenCapture, MacroParser macroParser, FileSystem fileSystem, Log log) { int component = 1; foreach (System.Windows.Forms.Screen screen in System.Windows.Forms.Screen.AllScreens) { ScreenCapture.DeviceOptions deviceResolution = screenCapture.GetDevice(screen); Add(new Screen() { ViewId = Guid.NewGuid(), Name = "Screen " + component, Folder = fileSystem.ScreenshotsFolder, Macro = macroParser.DefaultMacro, Component = component, Format = _imageFormatCollection.GetByName(ScreenCapture.DefaultImageFormat), JpegQuality = 100, Mouse = true, Active = true, X = screen.Bounds.X, Y = screen.Bounds.Y, Width = deviceResolution.width, Height = deviceResolution.height, Source = 0, DeviceName = deviceResolution.screen.DeviceName }); log.WriteDebugMessage($"Screen {component} created using \"{fileSystem.ScreenshotsFolder}\" for folder path and \"{macroParser.DefaultMacro}\" for macro."); component++; } }
/// <summary> /// Adjusts the position and size based on the selected component if AutoAdapt is enabled. /// This is useful for when your display setup changes over time while a screen capture session is running. /// </summary> /// <param name="screen">The screen to use.</param> /// <param name="x">The X value.</param> /// <param name="y">The Y value.</param> /// <param name="width">The Width value.</param> /// <param name="height">The Height value.</param> private void AutoAdapt(Screen screen, out int x, out int y, out int width, out int height) { x = 0; y = 0; width = 0; height = 0; if (screen.AutoAdapt) { for (int i = 0; i < System.Windows.Forms.Screen.AllScreens.Length; i++) { System.Windows.Forms.Screen screenFromWindows = System.Windows.Forms.Screen.AllScreens[i]; ScreenCapture.DeviceOptions deviceResolution = _screenCapture.GetDevice(screenFromWindows); if (i == screen.AutoAdaptIndex) { x = screenFromWindows.Bounds.X; y = screenFromWindows.Bounds.Y; width = deviceResolution.width; height = deviceResolution.height; break; } } } else { x = screen.X; y = screen.Y; width = screen.Width; height = screen.Height; } }
private void comboBoxScreenSource_SelectedIndexChanged(object sender, EventArgs e) { comboBoxScreenComponent.Items.Clear(); // Auto Screen Capture if (comboBoxScreenSource.SelectedIndex == 0) { comboBoxScreenComponent.Items.Add("Active Window"); // Add screens from screens.xml file. foreach (Screen screen in ScreenCollection) { // We don't want a Screen object that's null. if (screen == null) { continue; } // We don't care if it's a Screen using Active Window as its Component because that's already available in the list. // We also don't care if it's a Screen that's using AutoAdapt. if ((screen.Component == 0 && screen.Source == 0) || screen.AutoAdapt) { continue; } comboBoxScreenComponent.Items.Add("\"" + screen.Name + "\" X:" + screen.X + " Y:" + screen.Y + " (" + screen.Width + "x" + screen.Height + ")"); } // Add regions from regions.xml file. foreach (Region region in RegionCollection) { // We don't want a Region object that's null. if (region == null) { continue; } comboBoxScreenComponent.Items.Add("\"" + region.Name + "\" X:" + region.X + " Y:" + region.Y + " (" + region.Width + "x" + region.Height + ")"); } } // EnumDisplaySettings (user32.dll) if (comboBoxScreenSource.SelectedIndex == 1) { foreach (System.Windows.Forms.Screen screenFromWindows in System.Windows.Forms.Screen.AllScreens) { ScreenCapture.DeviceOptions deviceOptions = _screenCapture.GetDevice(screenFromWindows); comboBoxScreenComponent.Items.Add("\"" + deviceOptions.screen.DeviceName + "\" X:" + deviceOptions.screen.Bounds.X + " Y:" + deviceOptions.screen.Bounds.Y + " (" + deviceOptions.width + "x" + deviceOptions.height + ")"); } } // System.Windows.Forms.Screen (.NET) if (comboBoxScreenSource.SelectedIndex == 2) { foreach (System.Windows.Forms.Screen screenFromWindows in System.Windows.Forms.Screen.AllScreens) { comboBoxScreenComponent.Items.Add("\"" + screenFromWindows.DeviceName + "\" X:" + screenFromWindows.Bounds.X + " Y:" + screenFromWindows.Bounds.Y + " (" + screenFromWindows.Bounds.Width + "x" + screenFromWindows.Bounds.Height + ")"); } } if (ScreenObject != null && ScreenObject.Component < comboBoxScreenComponent.Items.Count) { comboBoxScreenComponent.SelectedIndex = ScreenObject.Component; } else { comboBoxScreenComponent.SelectedIndex = 0; } }
private void UpdatePreviewImage(ScreenCapture screenCapture) { try { // The mouse pointer gets really weird if we go under 100 resolution ratio // so disable the mouse checkbox control to indicate we can't show the mouse pointer. if (numericUpDownResolutionRatio.Value == 100) { checkBoxMouse.Enabled = true; } else { checkBoxMouse.Enabled = false; } if (checkBoxAutoAdapt.Checked) { labelScreenSource.Enabled = false; labelScreenComponent.Enabled = false; comboBoxScreenSource.Enabled = false; comboBoxScreenComponent.Enabled = false; labelX.Enabled = false; labelY.Enabled = false; labelWidth.Enabled = false; labelHeight.Enabled = false; numericUpDownX.Enabled = false; numericUpDownY.Enabled = false; numericUpDownWidth.Enabled = false; numericUpDownHeight.Enabled = false; } else { labelScreenSource.Enabled = true; labelScreenComponent.Enabled = true; comboBoxScreenSource.Enabled = true; comboBoxScreenComponent.Enabled = true; labelX.Enabled = true; labelY.Enabled = true; labelWidth.Enabled = true; labelHeight.Enabled = true; numericUpDownX.Enabled = true; numericUpDownY.Enabled = true; numericUpDownWidth.Enabled = true; numericUpDownHeight.Enabled = true; } // The Source is "Auto Screen Capture" and the Component is "Active Window". if (comboBoxScreenSource.SelectedIndex == 0 && comboBoxScreenComponent.SelectedIndex == 0) { labelX.Enabled = false; labelY.Enabled = false; labelWidth.Enabled = false; labelHeight.Enabled = false; numericUpDownX.Enabled = false; numericUpDownY.Enabled = false; numericUpDownWidth.Enabled = false; numericUpDownHeight.Enabled = false; } pictureBoxPreview.Image = null; if (checkBoxEnable.Checked) { // This is for when the option "Automatically adapt to display setup" is enabled. // We need to show the position and size based on what Windows provides. if (checkBoxAutoAdapt.Checked) { int x = 0; int y = 0; int width = 0; int height = 0; for (int i = 0; i < System.Windows.Forms.Screen.AllScreens.Length; i++) { System.Windows.Forms.Screen screenFromWindows = System.Windows.Forms.Screen.AllScreens[i]; ScreenCapture.DeviceOptions deviceResolution = _screenCapture.GetDevice(screenFromWindows); if (i == _autoAdaptIndex) { x = screenFromWindows.Bounds.X; y = screenFromWindows.Bounds.Y; width = deviceResolution.width; height = deviceResolution.height; break; } } pictureBoxPreview.Image = screenCapture.GetScreenBitmap( comboBoxScreenSource.SelectedIndex, comboBoxScreenComponent.SelectedIndex, comboBoxScreenCaptureMethod.SelectedIndex, x, y, width, height, (int)numericUpDownResolutionRatio.Value, checkBoxMouse.Checked ); } else { // The Source is "Auto Screen Capture" and the Component is "Active Window". if (comboBoxScreenSource.SelectedIndex == 0 && comboBoxScreenComponent.SelectedIndex == 0) { pictureBoxPreview.Image = screenCapture.GetActiveWindowBitmap((int)numericUpDownResolutionRatio.Value, checkBoxMouse.Checked); } else { pictureBoxPreview.Image = screenCapture.GetScreenBitmap( comboBoxScreenSource.SelectedIndex, comboBoxScreenComponent.SelectedIndex, comboBoxScreenCaptureMethod.SelectedIndex, (int)numericUpDownX.Value, (int)numericUpDownY.Value, (int)numericUpDownWidth.Value, (int)numericUpDownHeight.Value, (int)numericUpDownResolutionRatio.Value, checkBoxMouse.Checked ); } } UpdatePreviewMacro(); } else { textBoxMacroPreview.ForeColor = System.Drawing.Color.White; textBoxMacroPreview.BackColor = System.Drawing.Color.Black; textBoxMacroPreview.Text = "[Enable option is off. No screenshots of this screen will be taken during a running screen capture session]"; } } catch (Exception ex) { _log.WriteExceptionMessage("FormScreen::UpdatePreviewImage", ex); } }
/// <summary> /// Loads the screens. /// </summary> public bool LoadXmlFileAndAddScreens(ImageFormatCollection imageFormatCollection, Config config, MacroParser macroParser, ScreenCapture screenCapture, FileSystem fileSystem, Log log) { try { if (fileSystem.FileExists(fileSystem.ScreensFile)) { log.WriteDebugMessage("Screens file \"" + fileSystem.ScreensFile + "\" found. Attempting to load XML document"); XmlDocument xDoc = new XmlDocument(); xDoc.Load(fileSystem.ScreensFile); log.WriteDebugMessage("XML document loaded"); AppVersion = xDoc.SelectSingleNode("/autoscreen").Attributes["app:version"]?.Value; AppCodename = xDoc.SelectSingleNode("/autoscreen").Attributes["app:codename"]?.Value; XmlNodeList xScreens = xDoc.SelectNodes(SCREEN_XPATH); foreach (XmlNode xScreen in xScreens) { Screen screen = new Screen(); XmlNodeReader xReader = new XmlNodeReader(xScreen); while (xReader.Read()) { if (xReader.IsStartElement() && !xReader.IsEmptyElement) { switch (xReader.Name) { case SCREEN_VIEWID: xReader.Read(); screen.ViewId = Guid.Parse(xReader.Value); break; case SCREEN_NAME: xReader.Read(); screen.Name = xReader.Value; break; case SCREEN_FOLDER: xReader.Read(); screen.Folder = xReader.Value; break; case SCREEN_MACRO: xReader.Read(); screen.Macro = xReader.Value; break; case SCREEN_COMPONENT: xReader.Read(); screen.Component = Convert.ToInt32(xReader.Value); break; case SCREEN_FORMAT: xReader.Read(); screen.Format = imageFormatCollection.GetByName(xReader.Value); break; case SCREEN_JPEG_QUALITY: xReader.Read(); screen.JpegQuality = Convert.ToInt32(xReader.Value); break; case SCREEN_MOUSE: xReader.Read(); screen.Mouse = Convert.ToBoolean(xReader.Value); break; case SCREEN_ACTIVE: xReader.Read(); screen.Active = Convert.ToBoolean(xReader.Value); break; case SCREEN_X: xReader.Read(); screen.X = Convert.ToInt32(xReader.Value); break; case SCREEN_Y: xReader.Read(); screen.Y = Convert.ToInt32(xReader.Value); break; case SCREEN_WIDTH: xReader.Read(); screen.Width = Convert.ToInt32(xReader.Value); break; case SCREEN_HEIGHT: xReader.Read(); screen.Height = Convert.ToInt32(xReader.Value); break; case SCREEN_SOURCE: xReader.Read(); screen.Source = Convert.ToInt32(xReader.Value); break; case SCREEN_DEVICE_NAME: xReader.Read(); screen.DeviceName = xReader.Value; break; } } } xReader.Close(); // Change the data for each Screen that's being loaded if we've detected that // the XML document is from an older version of the application. if (config.Settings.VersionManager.IsOldAppVersion(config.Settings, AppCodename, AppVersion)) { log.WriteDebugMessage("An old version of the screens.xml file was detected. Attempting upgrade to new schema."); Version v2300 = config.Settings.VersionManager.Versions.Get(Settings.CODENAME_BOOMBAYAH, Settings.CODEVERSION_BOOMBAYAH); Version v2338 = config.Settings.VersionManager.Versions.Get(Settings.CODENAME_BOOMBAYAH, "2.3.3.8"); Version configVersion = config.Settings.VersionManager.Versions.Get(AppCodename, AppVersion); if (v2300 != null && configVersion != null && configVersion.VersionNumber < v2300.VersionNumber) { log.WriteDebugMessage("Dalek 2.2.4.6 or older detected"); // This is a new property for Screen that was introduced in 2.3.0.0 // so any version before 2.3.0.0 needs to have it during an upgrade. screen.Active = true; } if (v2338 != null && configVersion != null && configVersion.VersionNumber < v2338.VersionNumber) { log.WriteDebugMessage("Boombayah 2.3.3.7 or older detected"); int component = 1; foreach (System.Windows.Forms.Screen screenFromWindows in System.Windows.Forms.Screen.AllScreens) { ScreenCapture.DeviceOptions deviceOptions = screenCapture.GetDevice(screenFromWindows); if (screen.Component.Equals(component)) { screen.X = screenFromWindows.Bounds.X; screen.Y = screenFromWindows.Bounds.Y; screen.Width = deviceOptions.width; screen.Height = deviceOptions.height; screen.Source = 1; screen.DeviceName = deviceOptions.screen.DeviceName; } component++; } } } if (!string.IsNullOrEmpty(screen.Name)) { Add(screen); } } if (config.Settings.VersionManager.IsOldAppVersion(config.Settings, AppCodename, AppVersion)) { log.WriteDebugMessage("Screens file detected as an old version"); SaveToXmlFile(config, fileSystem, log); } } else { log.WriteDebugMessage("WARNING: Unable to load screens"); if (config.Settings.VersionManager.IsOldAppVersion(config.Settings, AppCodename, AppVersion)) { Version v2182 = config.Settings.VersionManager.Versions.Get(Settings.CODENAME_CLARA, Settings.CODEVERSION_CLARA); Version configVersion = config.Settings.VersionManager.Versions.Get(AppCodename, AppVersion); if (v2182 != null && configVersion != null && v2182.VersionNumber == configVersion.VersionNumber) { Add(new Screen() { ViewId = Guid.NewGuid(), Name = "Active Window", Folder = fileSystem.ScreenshotsFolder, Macro = macroParser.DefaultMacro, Component = 0, Format = _imageFormatCollection.GetByName(ScreenCapture.DefaultImageFormat), JpegQuality = 100, Mouse = true, Active = true, X = 0, Y = 0, Width = 0, Height = 0, Source = 0, DeviceName = string.Empty }); } } AddDefaultScreens(screenCapture, macroParser, fileSystem, log); SaveToXmlFile(config, fileSystem, log); } return(true); } catch (Exception ex) { log.WriteExceptionMessage("ScreenCollection::LoadXmlFileAndAddScreens", ex); return(false); } }
private void FormScreen_Load(object sender, EventArgs e) { textBoxScreenName.Focus(); HelpMessage("This is where to configure a screen capture. Select a source and a component then change the display properties and image attributes"); _toolTip.SetToolTip(checkBoxMouse, "You can include the mouse pointer in your screenshots if the \"Include mouse pointer\" option is checked"); _toolTip.SetToolTip(comboBoxFormat, "Change the image format for the screenshots taken by this screen capture. JPEG is the recommended image format"); _toolTip.SetToolTip(checkBoxActive, "You can capture this screen if Active is checked (turned on)"); _toolTip.SetToolTip(buttonScreenBrowseFolder, "Browse for a folder where screenshots of this screen capture will be saved to"); _toolTip.SetToolTip(buttonMacroTags, "Open a list of available macro tags. You can keep the Macro Tags window open while you modify your macro"); comboBoxFormat.Items.Clear(); pictureBoxPreview.Image = null; foreach (ImageFormat imageFormat in ImageFormatCollection) { comboBoxFormat.Items.Add(imageFormat.Name); } comboBoxScreenSource.Items.Clear(); comboBoxScreenSource.Items.Add("Auto Screen Capture"); comboBoxScreenSource.Items.Add("Graphics Card"); comboBoxScreenSource.Items.Add("Operating System"); for (int i = 1; i <= ScreenDictionary.Count; i++) { ScreenCapture.DeviceOptions deviceOptions = ScreenDictionary[i]; comboBoxScreenComponent.Items.Add("Screen " + i + " (" + deviceOptions.width + " x " + deviceOptions.height + ")"); } if (ScreenObject != null) { Text = "Change Screen"; textBoxScreenName.Text = ScreenObject.Name; textBoxFolder.Text = _fileSystem.CorrectScreenshotsFolderPath(ScreenObject.Folder); textBoxMacro.Text = ScreenObject.Macro; comboBoxScreenSource.SelectedIndex = ScreenObject.Source; comboBoxFormat.SelectedItem = ScreenObject.Format.Name; numericUpDownJpegQuality.Value = ScreenObject.JpegQuality; checkBoxMouse.Checked = ScreenObject.Mouse; checkBoxActive.Checked = ScreenObject.Active; numericUpDownX.Value = ScreenObject.X; numericUpDownY.Value = ScreenObject.Y; numericUpDownWidth.Value = ScreenObject.Width; numericUpDownHeight.Value = ScreenObject.Height; } else { Text = "Add Screen"; textBoxScreenName.Text = "Screen " + (ScreenCollection.Count + 1); textBoxFolder.Text = _fileSystem.ScreenshotsFolder; textBoxMacro.Text = _macroParser.DefaultMacro; comboBoxScreenSource.SelectedIndex = 0; comboBoxFormat.SelectedItem = ScreenCapture.DefaultImageFormat; numericUpDownJpegQuality.Value = 100; checkBoxMouse.Checked = true; checkBoxActive.Checked = true; numericUpDownX.Value = 0; numericUpDownY.Value = 0; numericUpDownWidth.Value = 0; numericUpDownHeight.Value = 0; } UpdatePreviewMacro(); UpdatePreviewImage(_screenCapture); }