mirror of
https://github.com/ShareX/ShareX.git
synced 2024-10-01 09:47:22 +13:00
Alternative way if GetScrollInfo fails
This commit is contained in:
parent
44c8df80ba
commit
6381336f37
3 changed files with 115 additions and 88 deletions
|
@ -475,14 +475,5 @@ public static bool FlashWindowEx(Form frm)
|
|||
|
||||
return FlashWindowEx(ref fInfo);
|
||||
}
|
||||
|
||||
public static bool IsScrollReachedBottom(IntPtr handle)
|
||||
{
|
||||
SCROLLINFO scrollInfo = new SCROLLINFO();
|
||||
scrollInfo.cbSize = (uint)Marshal.SizeOf(scrollInfo);
|
||||
scrollInfo.fMask = (uint)(ScrollInfoMask.SIF_RANGE | ScrollInfoMask.SIF_PAGE | ScrollInfoMask.SIF_TRACKPOS);
|
||||
NativeMethods.GetScrollInfo(handle, (int)SBOrientation.SB_VERT, ref scrollInfo);
|
||||
return scrollInfo.nMax == scrollInfo.nTrackPos + scrollInfo.nPage - 1;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,11 +1,18 @@
|
|||
namespace ShareX.ScreenCaptureLib
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Forms;
|
||||
using ShareX.HelpersLib;
|
||||
|
||||
namespace ShareX.ScreenCaptureLib
|
||||
{
|
||||
partial class ScrollingCaptureForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
private IContainer components = null;
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
|
@ -15,100 +22,100 @@ partial class ScrollingCaptureForm
|
|||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
this.btnSelectHandle = new System.Windows.Forms.Button();
|
||||
this.lblControlText = new System.Windows.Forms.Label();
|
||||
this.btnCapture = new System.Windows.Forms.Button();
|
||||
this.captureTimer = new System.Windows.Forms.Timer(this.components);
|
||||
this.nudScrollDelay = new System.Windows.Forms.NumericUpDown();
|
||||
this.nudMaximumScrollCount = new System.Windows.Forms.NumericUpDown();
|
||||
this.lblScrollDelay = new System.Windows.Forms.Label();
|
||||
this.lblMaximumScrollCount = new System.Windows.Forms.Label();
|
||||
this.tcScrollingCapture = new System.Windows.Forms.TabControl();
|
||||
this.tpCapture = new System.Windows.Forms.TabPage();
|
||||
this.tpOutput = new System.Windows.Forms.TabPage();
|
||||
this.pbOutput = new System.Windows.Forms.PictureBox();
|
||||
this.pOutput = new System.Windows.Forms.Panel();
|
||||
((System.ComponentModel.ISupportInitialize)(this.nudScrollDelay)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.nudMaximumScrollCount)).BeginInit();
|
||||
this.components = new Container();
|
||||
this.btnSelectHandle = new Button();
|
||||
this.lblControlText = new Label();
|
||||
this.btnCapture = new Button();
|
||||
this.captureTimer = new Timer(this.components);
|
||||
this.nudScrollDelay = new NumericUpDown();
|
||||
this.nudMaximumScrollCount = new NumericUpDown();
|
||||
this.lblScrollDelay = new Label();
|
||||
this.lblMaximumScrollCount = new Label();
|
||||
this.tcScrollingCapture = new TabControl();
|
||||
this.tpCapture = new TabPage();
|
||||
this.tpOutput = new TabPage();
|
||||
this.pbOutput = new PictureBox();
|
||||
this.pOutput = new Panel();
|
||||
((ISupportInitialize)(this.nudScrollDelay)).BeginInit();
|
||||
((ISupportInitialize)(this.nudMaximumScrollCount)).BeginInit();
|
||||
this.tcScrollingCapture.SuspendLayout();
|
||||
this.tpCapture.SuspendLayout();
|
||||
this.tpOutput.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pbOutput)).BeginInit();
|
||||
((ISupportInitialize)(this.pbOutput)).BeginInit();
|
||||
this.pOutput.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// btnSelectHandle
|
||||
//
|
||||
this.btnSelectHandle.Location = new System.Drawing.Point(12, 10);
|
||||
this.btnSelectHandle.Location = new Point(12, 10);
|
||||
this.btnSelectHandle.Name = "btnSelectHandle";
|
||||
this.btnSelectHandle.Size = new System.Drawing.Size(304, 23);
|
||||
this.btnSelectHandle.Size = new Size(304, 23);
|
||||
this.btnSelectHandle.TabIndex = 0;
|
||||
this.btnSelectHandle.Text = "Select window or control to scroll";
|
||||
this.btnSelectHandle.UseVisualStyleBackColor = true;
|
||||
this.btnSelectHandle.Click += new System.EventHandler(this.btnSelectHandle_Click);
|
||||
this.btnSelectHandle.Click += new EventHandler(this.btnSelectHandle_Click);
|
||||
//
|
||||
// lblControlText
|
||||
//
|
||||
this.lblControlText.Location = new System.Drawing.Point(324, 15);
|
||||
this.lblControlText.Location = new Point(324, 15);
|
||||
this.lblControlText.Name = "lblControlText";
|
||||
this.lblControlText.Size = new System.Drawing.Size(240, 19);
|
||||
this.lblControlText.Size = new Size(240, 19);
|
||||
this.lblControlText.TabIndex = 1;
|
||||
this.lblControlText.Text = "Text";
|
||||
//
|
||||
// btnCapture
|
||||
//
|
||||
this.btnCapture.Enabled = false;
|
||||
this.btnCapture.Location = new System.Drawing.Point(12, 106);
|
||||
this.btnCapture.Location = new Point(12, 106);
|
||||
this.btnCapture.Name = "btnCapture";
|
||||
this.btnCapture.Size = new System.Drawing.Size(152, 23);
|
||||
this.btnCapture.Size = new Size(152, 23);
|
||||
this.btnCapture.TabIndex = 2;
|
||||
this.btnCapture.Text = "Start capture";
|
||||
this.btnCapture.UseVisualStyleBackColor = true;
|
||||
this.btnCapture.Click += new System.EventHandler(this.btnCapture_Click);
|
||||
this.btnCapture.Click += new EventHandler(this.btnCapture_Click);
|
||||
//
|
||||
// captureTimer
|
||||
//
|
||||
this.captureTimer.Tick += new System.EventHandler(this.captureTimer_Tick);
|
||||
this.captureTimer.Tick += new EventHandler(this.captureTimer_Tick);
|
||||
//
|
||||
// nudScrollDelay
|
||||
//
|
||||
this.nudScrollDelay.Location = new System.Drawing.Point(140, 46);
|
||||
this.nudScrollDelay.Location = new Point(140, 46);
|
||||
this.nudScrollDelay.Maximum = new decimal(new int[] {
|
||||
5000,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.nudScrollDelay.Name = "nudScrollDelay";
|
||||
this.nudScrollDelay.Size = new System.Drawing.Size(80, 20);
|
||||
this.nudScrollDelay.Size = new Size(80, 20);
|
||||
this.nudScrollDelay.TabIndex = 3;
|
||||
this.nudScrollDelay.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||
this.nudScrollDelay.ValueChanged += new System.EventHandler(this.nudScrollDelay_ValueChanged);
|
||||
this.nudScrollDelay.TextAlign = HorizontalAlignment.Center;
|
||||
this.nudScrollDelay.ValueChanged += new EventHandler(this.nudScrollDelay_ValueChanged);
|
||||
//
|
||||
// nudMaximumScrollCount
|
||||
//
|
||||
this.nudMaximumScrollCount.Location = new System.Drawing.Point(140, 70);
|
||||
this.nudMaximumScrollCount.Location = new Point(140, 70);
|
||||
this.nudMaximumScrollCount.Name = "nudMaximumScrollCount";
|
||||
this.nudMaximumScrollCount.Size = new System.Drawing.Size(80, 20);
|
||||
this.nudMaximumScrollCount.Size = new Size(80, 20);
|
||||
this.nudMaximumScrollCount.TabIndex = 4;
|
||||
this.nudMaximumScrollCount.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||
this.nudMaximumScrollCount.ValueChanged += new System.EventHandler(this.nudMaximumScrollCount_ValueChanged);
|
||||
this.nudMaximumScrollCount.TextAlign = HorizontalAlignment.Center;
|
||||
this.nudMaximumScrollCount.ValueChanged += new EventHandler(this.nudMaximumScrollCount_ValueChanged);
|
||||
//
|
||||
// lblScrollDelay
|
||||
//
|
||||
this.lblScrollDelay.AutoSize = true;
|
||||
this.lblScrollDelay.Location = new System.Drawing.Point(12, 50);
|
||||
this.lblScrollDelay.Location = new Point(12, 50);
|
||||
this.lblScrollDelay.Name = "lblScrollDelay";
|
||||
this.lblScrollDelay.Size = new System.Drawing.Size(64, 13);
|
||||
this.lblScrollDelay.Size = new Size(64, 13);
|
||||
this.lblScrollDelay.TabIndex = 5;
|
||||
this.lblScrollDelay.Text = "Scroll delay:";
|
||||
//
|
||||
// lblMaximumScrollCount
|
||||
//
|
||||
this.lblMaximumScrollCount.AutoSize = true;
|
||||
this.lblMaximumScrollCount.Location = new System.Drawing.Point(12, 74);
|
||||
this.lblMaximumScrollCount.Location = new Point(12, 74);
|
||||
this.lblMaximumScrollCount.Name = "lblMaximumScrollCount";
|
||||
this.lblMaximumScrollCount.Size = new System.Drawing.Size(111, 13);
|
||||
this.lblMaximumScrollCount.Size = new Size(111, 13);
|
||||
this.lblMaximumScrollCount.TabIndex = 6;
|
||||
this.lblMaximumScrollCount.Text = "Maximum scroll count:";
|
||||
//
|
||||
|
@ -116,11 +123,11 @@ private void InitializeComponent()
|
|||
//
|
||||
this.tcScrollingCapture.Controls.Add(this.tpCapture);
|
||||
this.tcScrollingCapture.Controls.Add(this.tpOutput);
|
||||
this.tcScrollingCapture.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tcScrollingCapture.Location = new System.Drawing.Point(0, 0);
|
||||
this.tcScrollingCapture.Dock = DockStyle.Fill;
|
||||
this.tcScrollingCapture.Location = new Point(0, 0);
|
||||
this.tcScrollingCapture.Name = "tcScrollingCapture";
|
||||
this.tcScrollingCapture.SelectedIndex = 0;
|
||||
this.tcScrollingCapture.Size = new System.Drawing.Size(567, 427);
|
||||
this.tcScrollingCapture.Size = new Size(567, 427);
|
||||
this.tcScrollingCapture.TabIndex = 7;
|
||||
//
|
||||
// tpCapture
|
||||
|
@ -132,10 +139,10 @@ private void InitializeComponent()
|
|||
this.tpCapture.Controls.Add(this.btnCapture);
|
||||
this.tpCapture.Controls.Add(this.nudMaximumScrollCount);
|
||||
this.tpCapture.Controls.Add(this.nudScrollDelay);
|
||||
this.tpCapture.Location = new System.Drawing.Point(4, 22);
|
||||
this.tpCapture.Location = new Point(4, 22);
|
||||
this.tpCapture.Name = "tpCapture";
|
||||
this.tpCapture.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.tpCapture.Size = new System.Drawing.Size(559, 401);
|
||||
this.tpCapture.Padding = new Padding(3);
|
||||
this.tpCapture.Size = new Size(559, 401);
|
||||
this.tpCapture.TabIndex = 0;
|
||||
this.tpCapture.Text = "Capture";
|
||||
this.tpCapture.UseVisualStyleBackColor = true;
|
||||
|
@ -143,51 +150,51 @@ private void InitializeComponent()
|
|||
// tpOutput
|
||||
//
|
||||
this.tpOutput.Controls.Add(this.pOutput);
|
||||
this.tpOutput.Location = new System.Drawing.Point(4, 22);
|
||||
this.tpOutput.Location = new Point(4, 22);
|
||||
this.tpOutput.Name = "tpOutput";
|
||||
this.tpOutput.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.tpOutput.Size = new System.Drawing.Size(559, 401);
|
||||
this.tpOutput.Padding = new Padding(3);
|
||||
this.tpOutput.Size = new Size(559, 401);
|
||||
this.tpOutput.TabIndex = 1;
|
||||
this.tpOutput.Text = "Output";
|
||||
this.tpOutput.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// pbOutput
|
||||
//
|
||||
this.pbOutput.Location = new System.Drawing.Point(0, 0);
|
||||
this.pbOutput.Location = new Point(0, 0);
|
||||
this.pbOutput.Name = "pbOutput";
|
||||
this.pbOutput.Size = new System.Drawing.Size(100, 100);
|
||||
this.pbOutput.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
|
||||
this.pbOutput.Size = new Size(100, 100);
|
||||
this.pbOutput.SizeMode = PictureBoxSizeMode.AutoSize;
|
||||
this.pbOutput.TabIndex = 0;
|
||||
this.pbOutput.TabStop = false;
|
||||
//
|
||||
// pOutput
|
||||
//
|
||||
this.pOutput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.pOutput.Anchor = ((AnchorStyles)((((AnchorStyles.Top | AnchorStyles.Bottom)
|
||||
| AnchorStyles.Left)
|
||||
| AnchorStyles.Right)));
|
||||
this.pOutput.AutoScroll = true;
|
||||
this.pOutput.Controls.Add(this.pbOutput);
|
||||
this.pOutput.Location = new System.Drawing.Point(8, 8);
|
||||
this.pOutput.Location = new Point(8, 8);
|
||||
this.pOutput.Name = "pOutput";
|
||||
this.pOutput.Size = new System.Drawing.Size(544, 384);
|
||||
this.pOutput.Size = new Size(544, 384);
|
||||
this.pOutput.TabIndex = 1;
|
||||
//
|
||||
// ScrollingCaptureForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(567, 427);
|
||||
this.AutoScaleDimensions = new SizeF(6F, 13F);
|
||||
this.AutoScaleMode = AutoScaleMode.Font;
|
||||
this.ClientSize = new Size(567, 427);
|
||||
this.Controls.Add(this.tcScrollingCapture);
|
||||
this.Name = "ScrollingCaptureForm";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.StartPosition = FormStartPosition.CenterScreen;
|
||||
this.Text = "ShareX - Scrolling capture";
|
||||
((System.ComponentModel.ISupportInitialize)(this.nudScrollDelay)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.nudMaximumScrollCount)).EndInit();
|
||||
((ISupportInitialize)(this.nudScrollDelay)).EndInit();
|
||||
((ISupportInitialize)(this.nudMaximumScrollCount)).EndInit();
|
||||
this.tcScrollingCapture.ResumeLayout(false);
|
||||
this.tpCapture.ResumeLayout(false);
|
||||
this.tpCapture.PerformLayout();
|
||||
this.tpOutput.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pbOutput)).EndInit();
|
||||
((ISupportInitialize)(this.pbOutput)).EndInit();
|
||||
this.pOutput.ResumeLayout(false);
|
||||
this.pOutput.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
@ -196,18 +203,18 @@ private void InitializeComponent()
|
|||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Button btnSelectHandle;
|
||||
private System.Windows.Forms.Label lblControlText;
|
||||
private System.Windows.Forms.Button btnCapture;
|
||||
private System.Windows.Forms.Timer captureTimer;
|
||||
private System.Windows.Forms.NumericUpDown nudScrollDelay;
|
||||
private System.Windows.Forms.NumericUpDown nudMaximumScrollCount;
|
||||
private System.Windows.Forms.Label lblScrollDelay;
|
||||
private System.Windows.Forms.Label lblMaximumScrollCount;
|
||||
private System.Windows.Forms.TabControl tcScrollingCapture;
|
||||
private System.Windows.Forms.TabPage tpCapture;
|
||||
private System.Windows.Forms.TabPage tpOutput;
|
||||
private System.Windows.Forms.Panel pOutput;
|
||||
private System.Windows.Forms.PictureBox pbOutput;
|
||||
private Button btnSelectHandle;
|
||||
private Label lblControlText;
|
||||
private Button btnCapture;
|
||||
private Timer captureTimer;
|
||||
private NumericUpDown nudScrollDelay;
|
||||
private NumericUpDown nudMaximumScrollCount;
|
||||
private Label lblScrollDelay;
|
||||
private Label lblMaximumScrollCount;
|
||||
private TabControl tcScrollingCapture;
|
||||
private TabPage tpCapture;
|
||||
private TabPage tpOutput;
|
||||
private Panel pOutput;
|
||||
private PictureBox pbOutput;
|
||||
}
|
||||
}
|
|
@ -86,7 +86,7 @@ private void btnSelectHandle_Click(object sender, EventArgs e)
|
|||
if (simpleWindowInfo != null)
|
||||
{
|
||||
selectedWindow = new WindowInfo(simpleWindowInfo.Handle);
|
||||
lblControlText.Text = selectedWindow.ClassName ?? string.Empty;
|
||||
lblControlText.Text = selectedWindow.ClassName ?? String.Empty;
|
||||
btnCapture.Enabled = true;
|
||||
}
|
||||
else
|
||||
|
@ -161,6 +161,7 @@ private void Clean()
|
|||
|
||||
private void captureTimer_Tick(object sender, EventArgs e)
|
||||
{
|
||||
Screenshot.CaptureCursor = false;
|
||||
Image image = Screenshot.CaptureRectangle(selectedWindow.Rectangle);
|
||||
|
||||
if (image != null)
|
||||
|
@ -170,7 +171,7 @@ private void captureTimer_Tick(object sender, EventArgs e)
|
|||
|
||||
currentScrollCount++;
|
||||
|
||||
if (currentScrollCount == Options.MaximumScrollCount || NativeMethods.IsScrollReachedBottom(selectedWindow.Handle))
|
||||
if (currentScrollCount == Options.MaximumScrollCount || IsScrollReachedBottom(selectedWindow.Handle))
|
||||
{
|
||||
StopCapture();
|
||||
}
|
||||
|
@ -187,5 +188,33 @@ private void nudMaximumScrollCount_ValueChanged(object sender, EventArgs e)
|
|||
{
|
||||
Options.MaximumScrollCount = (int)nudMaximumScrollCount.Value;
|
||||
}
|
||||
|
||||
private bool IsScrollReachedBottom(IntPtr handle)
|
||||
{
|
||||
SCROLLINFO scrollInfo = new SCROLLINFO();
|
||||
scrollInfo.cbSize = (uint)Marshal.SizeOf(scrollInfo);
|
||||
scrollInfo.fMask = (uint)(ScrollInfoMask.SIF_RANGE | ScrollInfoMask.SIF_PAGE | ScrollInfoMask.SIF_TRACKPOS);
|
||||
|
||||
if (NativeMethods.GetScrollInfo(handle, (int)SBOrientation.SB_VERT, ref scrollInfo))
|
||||
{
|
||||
return scrollInfo.nMax == scrollInfo.nTrackPos + scrollInfo.nPage - 1;
|
||||
}
|
||||
|
||||
if (images.Count > 1)
|
||||
{
|
||||
bool result = ImageHelpers.IsImagesEqual((Bitmap)images[images.Count - 1], (Bitmap)images[images.Count - 2]);
|
||||
|
||||
if (result)
|
||||
{
|
||||
Image last = images[images.Count - 1];
|
||||
images.Remove(last);
|
||||
last.Dispose();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue