diff --git a/ShareX.ScreenCaptureLib/Forms/ScrollingCaptureForm.Designer.cs b/ShareX.ScreenCaptureLib/Forms/ScrollingCaptureForm.Designer.cs index 6e8f6cb0c..ebe945496 100644 --- a/ShareX.ScreenCaptureLib/Forms/ScrollingCaptureForm.Designer.cs +++ b/ShareX.ScreenCaptureLib/Forms/ScrollingCaptureForm.Designer.cs @@ -33,6 +33,8 @@ private void InitializeComponent() this.lblMaximumScrollCount = new System.Windows.Forms.Label(); this.tcScrollingCapture = new System.Windows.Forms.TabControl(); this.tpCapture = new System.Windows.Forms.TabPage(); + this.lblSelectedRectangle = new System.Windows.Forms.Label(); + this.btnSelectRectangle = new System.Windows.Forms.Button(); this.lblStartDelay = new System.Windows.Forms.Label(); this.nudStartDelay = new System.Windows.Forms.NumericUpDown(); this.cbScrollTopBeforeCapture = new System.Windows.Forms.CheckBox(); @@ -95,7 +97,7 @@ private void InitializeComponent() // lblControlText // this.lblControlText.AutoSize = true; - this.lblControlText.Location = new System.Drawing.Point(324, 21); + this.lblControlText.Location = new System.Drawing.Point(328, 21); this.lblControlText.Name = "lblControlText"; this.lblControlText.Size = new System.Drawing.Size(0, 13); this.lblControlText.TabIndex = 1; @@ -103,7 +105,7 @@ private void InitializeComponent() // btnCapture // this.btnCapture.Enabled = false; - this.btnCapture.Location = new System.Drawing.Point(16, 240); + this.btnCapture.Location = new System.Drawing.Point(16, 264); this.btnCapture.Name = "btnCapture"; this.btnCapture.Size = new System.Drawing.Size(152, 23); this.btnCapture.TabIndex = 2; @@ -117,7 +119,7 @@ private void InitializeComponent() // // nudScrollDelay // - this.nudScrollDelay.Location = new System.Drawing.Point(136, 92); + this.nudScrollDelay.Location = new System.Drawing.Point(136, 116); this.nudScrollDelay.Maximum = new decimal(new int[] { 5000, 0, @@ -131,7 +133,7 @@ private void InitializeComponent() // // nudMaximumScrollCount // - this.nudMaximumScrollCount.Location = new System.Drawing.Point(136, 116); + this.nudMaximumScrollCount.Location = new System.Drawing.Point(136, 140); this.nudMaximumScrollCount.Name = "nudMaximumScrollCount"; this.nudMaximumScrollCount.Size = new System.Drawing.Size(80, 20); this.nudMaximumScrollCount.TabIndex = 4; @@ -141,7 +143,7 @@ private void InitializeComponent() // lblScrollDelay // this.lblScrollDelay.AutoSize = true; - this.lblScrollDelay.Location = new System.Drawing.Point(16, 96); + this.lblScrollDelay.Location = new System.Drawing.Point(16, 120); this.lblScrollDelay.Name = "lblScrollDelay"; this.lblScrollDelay.Size = new System.Drawing.Size(64, 13); this.lblScrollDelay.TabIndex = 5; @@ -150,7 +152,7 @@ private void InitializeComponent() // lblMaximumScrollCount // this.lblMaximumScrollCount.AutoSize = true; - this.lblMaximumScrollCount.Location = new System.Drawing.Point(16, 120); + this.lblMaximumScrollCount.Location = new System.Drawing.Point(16, 144); this.lblMaximumScrollCount.Name = "lblMaximumScrollCount"; this.lblMaximumScrollCount.Size = new System.Drawing.Size(111, 13); this.lblMaximumScrollCount.TabIndex = 6; @@ -169,6 +171,8 @@ private void InitializeComponent() // // tpCapture // + this.tpCapture.Controls.Add(this.lblSelectedRectangle); + this.tpCapture.Controls.Add(this.btnSelectRectangle); this.tpCapture.Controls.Add(this.lblStartDelay); this.tpCapture.Controls.Add(this.nudStartDelay); this.tpCapture.Controls.Add(this.cbScrollTopBeforeCapture); @@ -192,10 +196,29 @@ private void InitializeComponent() this.tpCapture.Text = "Capture"; this.tpCapture.UseVisualStyleBackColor = true; // + // lblSelectedRectangle + // + this.lblSelectedRectangle.AutoSize = true; + this.lblSelectedRectangle.Location = new System.Drawing.Point(328, 45); + this.lblSelectedRectangle.Name = "lblSelectedRectangle"; + this.lblSelectedRectangle.Size = new System.Drawing.Size(0, 13); + this.lblSelectedRectangle.TabIndex = 16; + // + // btnSelectRectangle + // + this.btnSelectRectangle.Enabled = false; + this.btnSelectRectangle.Location = new System.Drawing.Point(16, 40); + this.btnSelectRectangle.Name = "btnSelectRectangle"; + this.btnSelectRectangle.Size = new System.Drawing.Size(304, 23); + this.btnSelectRectangle.TabIndex = 15; + this.btnSelectRectangle.Text = "(Optional) Select custom region in window..."; + this.btnSelectRectangle.UseVisualStyleBackColor = true; + this.btnSelectRectangle.Click += new System.EventHandler(this.btnSelectRectangle_Click); + // // lblStartDelay // this.lblStartDelay.AutoSize = true; - this.lblStartDelay.Location = new System.Drawing.Point(16, 72); + this.lblStartDelay.Location = new System.Drawing.Point(16, 96); this.lblStartDelay.Name = "lblStartDelay"; this.lblStartDelay.Size = new System.Drawing.Size(60, 13); this.lblStartDelay.TabIndex = 14; @@ -203,7 +226,7 @@ private void InitializeComponent() // // nudStartDelay // - this.nudStartDelay.Location = new System.Drawing.Point(136, 68); + this.nudStartDelay.Location = new System.Drawing.Point(136, 92); this.nudStartDelay.Maximum = new decimal(new int[] { 5000, 0, @@ -218,7 +241,7 @@ private void InitializeComponent() // cbScrollTopBeforeCapture // this.cbScrollTopBeforeCapture.AutoSize = true; - this.cbScrollTopBeforeCapture.Location = new System.Drawing.Point(16, 168); + this.cbScrollTopBeforeCapture.Location = new System.Drawing.Point(16, 192); this.cbScrollTopBeforeCapture.Name = "cbScrollTopBeforeCapture"; this.cbScrollTopBeforeCapture.Size = new System.Drawing.Size(223, 17); this.cbScrollTopBeforeCapture.TabIndex = 12; @@ -229,7 +252,7 @@ private void InitializeComponent() // cbStartCaptureAutomatically // this.cbStartCaptureAutomatically.AutoSize = true; - this.cbStartCaptureAutomatically.Location = new System.Drawing.Point(16, 144); + this.cbStartCaptureAutomatically.Location = new System.Drawing.Point(16, 168); this.cbStartCaptureAutomatically.Name = "cbStartCaptureAutomatically"; this.cbStartCaptureAutomatically.Size = new System.Drawing.Size(213, 17); this.cbStartCaptureAutomatically.TabIndex = 11; @@ -240,7 +263,7 @@ private void InitializeComponent() // cbRemoveDuplicates // this.cbRemoveDuplicates.AutoSize = true; - this.cbRemoveDuplicates.Location = new System.Drawing.Point(16, 216); + this.cbRemoveDuplicates.Location = new System.Drawing.Point(16, 240); this.cbRemoveDuplicates.Name = "cbRemoveDuplicates"; this.cbRemoveDuplicates.Size = new System.Drawing.Size(117, 17); this.cbRemoveDuplicates.TabIndex = 10; @@ -251,7 +274,7 @@ private void InitializeComponent() // cbAutoDetectScrollEnd // this.cbAutoDetectScrollEnd.AutoSize = true; - this.cbAutoDetectScrollEnd.Location = new System.Drawing.Point(16, 192); + this.cbAutoDetectScrollEnd.Location = new System.Drawing.Point(16, 216); this.cbAutoDetectScrollEnd.Name = "cbAutoDetectScrollEnd"; this.cbAutoDetectScrollEnd.Size = new System.Drawing.Size(129, 17); this.cbAutoDetectScrollEnd.TabIndex = 9; @@ -262,7 +285,7 @@ private void InitializeComponent() // lblScrollMethod // this.lblScrollMethod.AutoSize = true; - this.lblScrollMethod.Location = new System.Drawing.Point(16, 48); + this.lblScrollMethod.Location = new System.Drawing.Point(16, 72); this.lblScrollMethod.Name = "lblScrollMethod"; this.lblScrollMethod.Size = new System.Drawing.Size(74, 13); this.lblScrollMethod.TabIndex = 8; @@ -272,7 +295,7 @@ private void InitializeComponent() // this.cbScrollMethod.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cbScrollMethod.FormattingEnabled = true; - this.cbScrollMethod.Location = new System.Drawing.Point(136, 44); + this.cbScrollMethod.Location = new System.Drawing.Point(136, 68); this.cbScrollMethod.Name = "cbScrollMethod"; this.cbScrollMethod.Size = new System.Drawing.Size(312, 21); this.cbScrollMethod.TabIndex = 7; @@ -625,5 +648,7 @@ private void InitializeComponent() private Label lblImageCount; private Label lblStartDelay; private NumericUpDown nudStartDelay; + private Button btnSelectRectangle; + private Label lblSelectedRectangle; } } \ No newline at end of file diff --git a/ShareX.ScreenCaptureLib/Forms/ScrollingCaptureForm.cs b/ShareX.ScreenCaptureLib/Forms/ScrollingCaptureForm.cs index 45be2a386..50e852e2d 100644 --- a/ShareX.ScreenCaptureLib/Forms/ScrollingCaptureForm.cs +++ b/ShareX.ScreenCaptureLib/Forms/ScrollingCaptureForm.cs @@ -46,6 +46,7 @@ public partial class ScrollingCaptureForm : BaseForm public Image Result { get; set; } private WindowInfo selectedWindow; + private Rectangle selectedRectangle; private List images = new List(); private int currentScrollCount; private bool isBusy, isCapturing, firstCapture, detectingScrollMethod; @@ -104,6 +105,11 @@ private void btnSelectHandle_Click(object sender, EventArgs e) SelectHandle(); } + private void btnSelectRectangle_Click(object sender, EventArgs e) + { + SelectRectangle(); + } + private void SelectHandle() { WindowState = FormWindowState.Minimized; @@ -113,13 +119,16 @@ private void SelectHandle() try { Thread.Sleep(250); + SimpleWindowInfo simpleWindowInfo = GetWindowInfo(); if (simpleWindowInfo != null) { selectedWindow = new WindowInfo(simpleWindowInfo.Handle); lblControlText.Text = selectedWindow.ClassName ?? string.Empty; - btnCapture.Enabled = true; + selectedRectangle = simpleWindowInfo.Rectangle; + lblSelectedRectangle.Text = selectedRectangle.ToString(); + btnSelectRectangle.Enabled = btnCapture.Enabled = true; if (Options.StartCaptureAutomatically) { @@ -138,6 +147,27 @@ private void SelectHandle() } } + private void SelectRectangle() + { + WindowState = FormWindowState.Minimized; + + try + { + Thread.Sleep(250); + + Rectangle rect; + if (Surface.SelectRegion(out rect)) + { + selectedRectangle = rect; + lblSelectedRectangle.Text = selectedRectangle.ToString(); + } + } + finally + { + this.ShowActivate(); + } + } + private void btnCapture_Click(object sender, EventArgs e) { if (isCapturing) @@ -275,7 +305,7 @@ private void captureTimer_Tick(object sender, EventArgs e) } Screenshot.CaptureCursor = false; - Image image = Screenshot.CaptureRectangle(selectedWindow.Rectangle); + Image image = Screenshot.CaptureRectangle(selectedRectangle); if (image != null) { diff --git a/ShareX.ScreenCaptureLib/Forms/Surface.cs b/ShareX.ScreenCaptureLib/Forms/Surface.cs index e71d65c5e..356e0604a 100644 --- a/ShareX.ScreenCaptureLib/Forms/Surface.cs +++ b/ShareX.ScreenCaptureLib/Forms/Surface.cs @@ -429,5 +429,56 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); } + + public static bool SelectRegion(out Rectangle rect) + { + return SelectRegion(out rect, new SurfaceOptions()); + } + + public static bool SelectRegion(out Rectangle rect, SurfaceOptions options) + { + using (RectangleRegion surface = new RectangleRegion()) + { + surface.Config = options; + surface.Config.ShowTips = false; + surface.Config.QuickCrop = true; + surface.Config.ForceWindowCapture = true; + surface.Prepare(); + surface.ShowDialog(); + + if (surface.Result == SurfaceResult.Region) + { + if (surface.AreaManager.IsCurrentAreaValid) + { + rect = CaptureHelpers.ClientToScreen(surface.AreaManager.CurrentArea); + return true; + } + } + else if (surface.Result == SurfaceResult.Fullscreen) + { + rect = CaptureHelpers.GetScreenBounds(); + return true; + } + else if (surface.Result == SurfaceResult.Monitor) + { + Screen[] screens = Screen.AllScreens; + + if (surface.MonitorIndex < screens.Length) + { + Screen screen = screens[surface.MonitorIndex]; + rect = screen.Bounds; + return true; + } + } + else if (surface.Result == SurfaceResult.ActiveMonitor) + { + rect = CaptureHelpers.GetActiveScreenBounds(); + return true; + } + } + + rect = Rectangle.Empty; + return false; + } } } \ No newline at end of file diff --git a/ShareX.ScreenCaptureLib/ScrollingCaptureOptions.cs b/ShareX.ScreenCaptureLib/ScrollingCaptureOptions.cs index 32516a2ff..665763d55 100644 --- a/ShareX.ScreenCaptureLib/ScrollingCaptureOptions.cs +++ b/ShareX.ScreenCaptureLib/ScrollingCaptureOptions.cs @@ -34,7 +34,7 @@ namespace ShareX public class ScrollingCaptureOptions { public ScrollingCaptureScrollMethod ScrollMethod { get; set; } = ScrollingCaptureScrollMethod.Automatic; - public int StartDelay { get; set; } = 1000; + public int StartDelay { get; set; } = 500; public int ScrollDelay { get; set; } = 500; public int MaximumScrollCount { get; set; } = 20; public bool StartSelectionAutomatically { get; set; } = true; diff --git a/ShareX/TaskHelpers.cs b/ShareX/TaskHelpers.cs index b6a96c8d7..1983e3e8c 100644 --- a/ShareX/TaskHelpers.cs +++ b/ShareX/TaskHelpers.cs @@ -324,48 +324,7 @@ private static void AddExternalProgramFromRegistry(TaskSettings taskSettings, st public static bool SelectRegion(out Rectangle rect, TaskSettings taskSettings) { - using (RectangleRegion surface = new RectangleRegion()) - { - surface.Config = taskSettings.CaptureSettings.SurfaceOptions; - surface.Config.ShowTips = false; - surface.Config.QuickCrop = true; - surface.Config.ForceWindowCapture = true; - surface.Prepare(); - surface.ShowDialog(); - - if (surface.Result == SurfaceResult.Region) - { - if (surface.AreaManager.IsCurrentAreaValid) - { - rect = CaptureHelpers.ClientToScreen(surface.AreaManager.CurrentArea); - return true; - } - } - else if (surface.Result == SurfaceResult.Fullscreen) - { - rect = CaptureHelpers.GetScreenBounds(); - return true; - } - else if (surface.Result == SurfaceResult.Monitor) - { - Screen[] screens = Screen.AllScreens; - - if (surface.MonitorIndex < screens.Length) - { - Screen screen = screens[surface.MonitorIndex]; - rect = screen.Bounds; - return true; - } - } - else if (surface.Result == SurfaceResult.ActiveMonitor) - { - rect = CaptureHelpers.GetActiveScreenBounds(); - return true; - } - } - - rect = Rectangle.Empty; - return false; + return Surface.SelectRegion(out rect, taskSettings.CaptureSettings.SurfaceOptions); } public static PointInfo SelectPointColor()