public IHttpActionResult Capture([XmlBody] XDocument input) { try { _xmlDocumentProcessor.Capture(input); return(Ok()); } catch (Exception ex) { return(BadRequest(ex.Message)); } }
public static byte[] CaptureNoCursorToBytes(Size size) { if (_hasSystemAuthor) { Win32Interop.SwitchToInputDesktop(); } _capturer.Size = size; _capturer.Capture(); using (var ms = new MemoryStream()) { _capturer.CurrentFrame.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); return(ms.ToArray()); } }
public string Capture() { try { var message = OperationContext.Current.RequestContext.RequestMessage.ToString() ?? ""; var document = XDocument.Parse(message); _xmlDocumentProcessor.Capture(document); return("OK"); } catch (Exception ex) { throw EpcisFault.Create(ex); } }
public void Capture() { _capturer.Capture(); }
public static async void BeginScreenCasting(string viewerID, string requesterName, ICapturer capturer, Conductor conductor) { Viewer viewer; byte[] encodedImageBytes; var success = false; Logger.Write($"Starting screen cast. Requester: {requesterName}. Viewer ID: {viewerID}. Capturer: {capturer.GetType().ToString()}. App Mode: {conductor.Mode} Desktop: {conductor.CurrentDesktopName}"); viewer = new Viewer() { Capturer = capturer, DisconnectRequested = false, Name = requesterName, ViewerConnectionID = viewerID, HasControl = true }; while (!success) { success = conductor.Viewers.TryAdd(viewerID, viewer); } if (conductor.Mode == Enums.AppMode.Normal) { conductor.InvokeViewerAdded(viewer); } await conductor.OutgoingMessages.SendScreenCount( capturer.SelectedScreen, capturer.GetScreenCount(), viewerID); await conductor.OutgoingMessages.SendScreenSize(capturer.CurrentScreenBounds.Width, capturer.CurrentScreenBounds.Height, viewerID); capturer.ScreenChanged += async(sender, bounds) => { await conductor.OutgoingMessages.SendScreenSize(bounds.Width, bounds.Height, viewerID); }; // TODO: SetThradDesktop causes issues with input after switching. //var desktopName = Win32Interop.GetCurrentDesktop(); while (!viewer.DisconnectRequested) { try { // TODO: SetThradDesktop causes issues with input after switching. //var currentDesktopName = Win32Interop.GetCurrentDesktop(); //if (desktopName.ToLower() != currentDesktopName.ToLower()) //{ // desktopName = currentDesktopName; // Logger.Write($"Switching to desktop {desktopName} in ScreenCaster."); // var inputDesktop = Win32Interop.OpenInputDesktop(); // User32.SetThreadDesktop(inputDesktop); // User32.CloseDesktop(inputDesktop); // continue; //} while (viewer.PendingFrames > 10) { await Task.Delay(1); } capturer.Capture(); var diffArea = ImageUtils.GetDiffArea(capturer.CurrentFrame, capturer.PreviousFrame, capturer.CaptureFullscreen); if (diffArea.IsEmpty) { continue; } using (var newImage = capturer.CurrentFrame.Clone(diffArea, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { if (capturer.CaptureFullscreen) { capturer.CaptureFullscreen = false; } //long newQuality; //if (viewer.PendingFrames < 8) //{ // newQuality = Math.Min(1, viewer.ImageQuality + 1); //} //else //{ // newQuality = Math.Max(0, viewer.ImageQuality - 1); //} //if (newQuality != viewer.ImageQuality) //{ // Logger.Write($"New quality: {newQuality}"); // viewer.ImageQuality = newQuality; // viewer.FullScreenRefreshNeeded = true; //} //else if (viewer.FullScreenRefreshNeeded) //{ // Logger.Write($"Quality stabilized."); // capturer.CaptureFullscreen = true; // viewer.FullScreenRefreshNeeded = false; //} encodedImageBytes = ImageUtils.EncodeBitmap(newImage, viewer.EncoderParams); if (encodedImageBytes?.Length > 0) { await conductor.OutgoingMessages.SendScreenCapture(encodedImageBytes, viewerID, diffArea.Left, diffArea.Top, diffArea.Width, diffArea.Height, DateTime.UtcNow); viewer.PendingFrames++; } // TODO: Even after disposing of the bitmap, GC doesn't collect in time. Memory usage soars quickly. // Need to revisit this later. GC.Collect(); } } catch (Exception ex) { Logger.Write(ex); } } Logger.Write($"Ended screen cast. Requester: {requesterName}. Viewer ID: {viewerID}."); success = false; while (!success) { success = conductor.Viewers.TryRemove(viewerID, out _); } capturer.Dispose(); // Close if no one is viewing. if (conductor.Viewers.Count == 0 && conductor.Mode == Enums.AppMode.Unattended) { Environment.Exit(0); } }
public static async void BeginScreenCasting(string viewerID, string requesterName, ICapturer capturer, Conductor conductor) { Viewer viewer; byte[] encodedImageBytes; Logger.Write($"Starting screen cast. Requester: {requesterName}. Viewer ID: {viewerID}. Capturer: {capturer.GetType().ToString()}. App Mode: {conductor.Mode} Desktop: {conductor.CurrentDesktopName}"); viewer = new Viewer() { Capturer = capturer, DisconnectRequested = false, Name = requesterName, ViewerConnectionID = viewerID, HasControl = true }; conductor.Viewers.AddOrUpdate(viewerID, viewer, (id, v) => viewer); if (conductor.Mode == Enums.AppMode.Normal) { conductor.InvokeViewerAdded(viewer); } await conductor.CasterSocket.SendMachineName(Environment.MachineName, viewerID); await conductor.CasterSocket.SendScreenCount( capturer.SelectedScreen, capturer.GetScreenCount(), viewerID); await conductor.CasterSocket.SendScreenSize(capturer.CurrentScreenBounds.Width, capturer.CurrentScreenBounds.Height, viewerID); capturer.ScreenChanged += async(sender, bounds) => { await conductor.CasterSocket.SendScreenSize(bounds.Width, bounds.Height, viewerID); }; var desktopName = string.Empty; if (OSUtils.IsWindows) { desktopName = Win32Interop.GetCurrentDesktop(); } while (!viewer.DisconnectRequested) { try { var currentDesktopName = Win32Interop.GetCurrentDesktop(); if (desktopName.ToLower() != currentDesktopName.ToLower()) { desktopName = currentDesktopName; Logger.Write($"Switching to desktop {desktopName} in ScreenCaster."); Win32Interop.SwitchToInputDesktop(); continue; } while (viewer.PendingFrames > 10) { await Task.Delay(1); } capturer.Capture(); var diffArea = ImageUtils.GetDiffArea(capturer.CurrentFrame, capturer.PreviousFrame, capturer.CaptureFullscreen); if (diffArea.IsEmpty) { continue; } using (var newImage = capturer.CurrentFrame.Clone(diffArea, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { if (capturer.CaptureFullscreen) { capturer.CaptureFullscreen = false; } encodedImageBytes = ImageUtils.EncodeBitmap(newImage, viewer.EncoderParams); if (encodedImageBytes?.Length > 0) { await conductor.CasterSocket.SendScreenCapture(encodedImageBytes, viewerID, diffArea.Left, diffArea.Top, diffArea.Width, diffArea.Height, DateTime.UtcNow); viewer.PendingFrames++; } } } catch (Exception ex) { Logger.Write(ex); } finally { // TODO: Even after disposing of the bitmap, GC doesn't collect in time. Memory usage soars quickly. // Need to revisit this later. GC.Collect(); } } Logger.Write($"Ended screen cast. Requester: {requesterName}. Viewer ID: {viewerID}."); conductor.Viewers.TryRemove(viewerID, out _); capturer.Dispose(); // Close if no one is viewing. if (conductor.Viewers.Count == 0 && conductor.Mode == Enums.AppMode.Unattended) { Environment.Exit(0); } }