diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-03-01 01:30:14 +0200 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-03-01 01:30:14 +0200 |
| commit | fcbfe9a519b9d9d9850e57e08c6033d56ed98e17 (patch) | |
| tree | a6de78ad2819f748b020e7de0549bb64abb3aef3 /Software/Visual_Studio/Tango.ScreenCapture/ScreenCaptureEngine.cs | |
| parent | eb5e79f5dc4983612b1716cf6e52323dc0da0ba6 (diff) | |
| download | Tango-fcbfe9a519b9d9d9850e57e08c6033d56ed98e17.tar.gz Tango-fcbfe9a519b9d9d9850e57e08c6033d56ed98e17.zip | |
Working on Tango.ScreenCapture/RemoteDesktop.
Diffstat (limited to 'Software/Visual_Studio/Tango.ScreenCapture/ScreenCaptureEngine.cs')
| -rw-r--r-- | Software/Visual_Studio/Tango.ScreenCapture/ScreenCaptureEngine.cs | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Tango.ScreenCapture/ScreenCaptureEngine.cs b/Software/Visual_Studio/Tango.ScreenCapture/ScreenCaptureEngine.cs new file mode 100644 index 000000000..9933512c3 --- /dev/null +++ b/Software/Visual_Studio/Tango.ScreenCapture/ScreenCaptureEngine.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Tango.ScreenCapture +{ + public class ScreenCaptureEngine : IDisposable + { + private bool _isDisposed; + private Thread _captureThread; + private Bitmap _previousBitmap; + private ImageComparer _comparer; + + public event EventHandler<ScreenCaptureFrameReceivedEventArgs> ScreenFrameReceived; + + public IScreenCaptureMethod CaptureMethod { get; set; } + public CaptureRegion CaptureRegion { get; set; } + public bool IsStarted { get; set; } + public TimeSpan Interval { get; set; } + public bool CaptureCursor { get; set; } + public bool EnableImageComparison { get; set; } + + public ScreenCaptureEngine() + { + Interval = TimeSpan.FromMilliseconds(100); + CaptureMethod = new GdiScreenCapture(); + CaptureRegion = new CaptureRegion(System.Windows.Forms.Screen.PrimaryScreen.Bounds); + _comparer = new ImageComparer(); + EnableImageComparison = true; + } + + public void Start() + { + if (_isDisposed) + { + throw new ObjectDisposedException("Screen capture engine cannot be started after disposed."); + } + + if (!IsStarted) + { + IsStarted = true; + + _captureThread = new Thread(CaptureThreadMethod); + _captureThread.IsBackground = true; + _captureThread.Name = "Screen Capture Thread"; + _captureThread.Start(); + } + } + + public void Stop() + { + if (IsStarted) + { + IsStarted = false; + } + } + + private void CaptureThreadMethod() + { + while (IsStarted) + { + var bitmap = CaptureMethod.GetDesktopBitmap(CaptureRegion); + + if (CaptureCursor) + { + using (Graphics g = Graphics.FromImage(bitmap)) + { + CursorUtils.ApplyCursor(g, bitmap, CaptureRegion.Left, CaptureRegion.Top); + } + } + + if (EnableImageComparison) + { + if (_previousBitmap == null) + { + _previousBitmap = bitmap.Clone() as Bitmap; + OnScreenFrameReceived(new ScreenCaptureFrame(bitmap, null)); + } + else + { + var diffBitmap = _comparer.CreateDifferenceBitmap(_previousBitmap, bitmap, Color.Transparent); + _previousBitmap.Dispose(); + _previousBitmap = bitmap.Clone() as Bitmap; + OnScreenFrameReceived(new ScreenCaptureFrame(bitmap, diffBitmap)); + } + } + else + { + OnScreenFrameReceived(new ScreenCaptureFrame(bitmap, null)); + } + + Thread.Sleep(Interval); + } + } + + public void Dispose() + { + if (!_isDisposed) + { + _isDisposed = true; + Stop(); + CaptureMethod?.Dispose(); + } + } + + protected virtual void OnScreenFrameReceived(ScreenCaptureFrame frame) + { + ScreenFrameReceived?.Invoke(this, new ScreenCaptureFrameReceivedEventArgs() + { + Frame = frame, + }); + } + } +} |
