Пример #1
0
 private void ScreenCastRequested(object sender, ScreenCastRequest screenCastRequest)
 {
     App.Current.Dispatcher.Invoke(() =>
     {
         var result = MessageBox.Show($"You've received a connection request from {screenCastRequest.RequesterName}.  Accept?", "Connection Request", MessageBoxButton.YesNo, MessageBoxImage.Question);
         if (result == MessageBoxResult.Yes)
         {
             Task.Run(async() =>
             {
                 ICapturer capturer;
                 try
                 {
                     if (Conductor.Viewers.Count == 0)
                     {
                         capturer = new DXCapture();
                     }
                     else
                     {
                         capturer = new BitBltCapture();
                     }
                 }
                 catch (Exception ex)
                 {
                     Logger.Write(ex);
                     capturer = new BitBltCapture();
                 }
                 await Conductor.CasterSocket.SendCursorChange(CursorIconWatcher.GetCurrentCursor(), new List <string>()
                 {
                     screenCastRequest.ViewerID
                 });
                 ScreenCaster.BeginScreenCasting(screenCastRequest.ViewerID, screenCastRequest.RequesterName, capturer, Conductor);
             });
         }
     });
 }
Пример #2
0
        public static void Main(string[] args)
        {
            try
            {
                AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
                Conductor = new Conductor();
                Conductor.ProcessArgs(args);

                Conductor.ScreenCastInitiated  += ScreenCastInitiated;
                Conductor.AudioToggled         += AudioToggled;
                Conductor.ClipboardTransferred += Conductor_ClipboardTransferred;

                Conductor.Connect().ContinueWith(async(task) =>
                {
                    Conductor.SetMessageHandlers(new WinInput());
                    AudioCapturer               = new AudioCapturer(Conductor);
                    CursorIconWatcher           = new CursorIconWatcher(Conductor);
                    CursorIconWatcher.OnChange += CursorIconWatcher_OnChange;
                    await Conductor.CasterSocket.SendDeviceInfo(Conductor.ServiceID, Environment.MachineName, Conductor.DeviceID);
                    CheckInitialDesktop();
                    await CheckForRelaunch();
                    Conductor.IdleTimer = new IdleTimer(Conductor.Viewers);
                    Conductor.IdleTimer.Start();

                    await HandleConnection(Conductor);
                });

                Thread.Sleep(Timeout.Infinite);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw;
            }
        }
Пример #3
0
        private static async void ScreenCastInitiated(object sender, ScreenCastRequest screenCastRequest)
        {
            ICapturer capturer;

            try
            {
                if (Conductor.Viewers.Count == 0)
                {
                    capturer = new DXCapture();
                }
                else
                {
                    capturer = new BitBltCapture();
                }
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                capturer = new BitBltCapture();
            }
            await Conductor.CasterSocket.SendCursorChange(CursorIconWatcher.GetCurrentCursor(), new List <string>() { screenCastRequest.ViewerID });

            ScreenCaster.BeginScreenCasting(screenCastRequest.ViewerID, screenCastRequest.RequesterName, capturer, Conductor);
            BeginAudioCapture();
        }
Пример #4
0
 public static void Main(string[] args)
 {
     try
     {
         AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
         Conductor = new Conductor();
         Conductor.ProcessArgs(args);
         Conductor.Connect().Wait();
         Conductor.SetMessageHandlers(new WinInput());
         Conductor.ScreenCastInitiated += ScreenCastInitiated;
         AudioCapturer               = new AudioCapturer(Conductor);
         CursorIconWatcher           = new CursorIconWatcher(Conductor);
         CursorIconWatcher.OnChange += CursorIconWatcher_OnChange;
         Conductor.CasterSocket.SendDeviceInfo(Conductor.ServiceID, Environment.MachineName).Wait();
         CheckInitialDesktop();
         CheckForRelaunch();
         Conductor.StartWaitForViewerTimer();
         HandleConnection(Conductor).Wait();
     }
     catch (Exception ex)
     {
         Logger.Write(ex);
         throw;
     }
 }
Пример #5
0
        public static void Main(string[] args)
        {
            try
            {
                AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
                CursorIconWatcher = new CursorIconWatcher(Conductor);
                var screenCaster     = new WinScreenCaster(CursorIconWatcher);
                var clipboardService = new WinClipboardService();
                clipboardService.BeginWatching();
                var casterSocket = new CasterSocket(new WinInput(), screenCaster, new WinAudioCapturer(), clipboardService);
                Conductor = new Conductor(casterSocket, screenCaster);
                Conductor.ProcessArgs(args);

                Conductor.Connect().ContinueWith(async(task) =>
                {
                    CursorIconWatcher.OnChange += CursorIconWatcher_OnChange;
                    await Conductor.CasterSocket.SendDeviceInfo(Conductor.ServiceID, Environment.MachineName, Conductor.DeviceID);
                    CheckInitialDesktop();
                    await CheckForRelaunch();
                    Conductor.IdleTimer = new IdleTimer(Conductor.Viewers);
                    Conductor.IdleTimer.Start();

                    await HandleConnection(Conductor);
                });

                Thread.Sleep(Timeout.Infinite);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw;
            }
        }
Пример #6
0
 public MainWindowViewModel()
 {
     Current   = this;
     Conductor = new Conductor();
     Conductor.SessionIDChanged    += SessionIDChanged;
     Conductor.ViewerRemoved       += ViewerRemoved;
     Conductor.ViewerAdded         += ViewerAdded;
     Conductor.ScreenCastRequested += ScreenCastRequested;
     CursorIconWatcher              = new CursorIconWatcher(Conductor);
     CursorIconWatcher.OnChange    += CursorIconWatcher_OnChange;
 }
Пример #7
0
 public MainWindowViewModel()
 {
     Current   = this;
     Conductor = new Conductor();
     Conductor.SessionIDChanged     += SessionIDChanged;
     Conductor.ViewerRemoved        += ViewerRemoved;
     Conductor.ViewerAdded          += ViewerAdded;
     Conductor.ScreenCastRequested  += ScreenCastRequested;
     Conductor.AudioToggled         += AudioToggled;
     Conductor.ClipboardTransferred += Conductor_ClipboardTransferred;
     CursorIconWatcher           = new CursorIconWatcher(Conductor);
     CursorIconWatcher.OnChange += CursorIconWatcher_OnChange;
     AudioCapturer = new AudioCapturer(Conductor);
 }
Пример #8
0
        public MainWindowViewModel()
        {
            Current = this;

            CursorIconWatcher           = new CursorIconWatcher(Conductor);
            CursorIconWatcher.OnChange += CursorIconWatcher_OnChange;

            var screenCaster     = new WinScreenCaster(CursorIconWatcher);
            var clipboardService = new WinClipboardService();

            clipboardService.BeginWatching();
            var casterSocket = new CasterSocket(new WinInput(), screenCaster, new WinAudioCapturer(), clipboardService);

            Conductor = new Conductor(casterSocket, screenCaster);

            Conductor.SessionIDChanged    += SessionIDChanged;
            Conductor.ViewerRemoved       += ViewerRemoved;
            Conductor.ViewerAdded         += ViewerAdded;
            Conductor.ScreenCastRequested += ScreenCastRequested;
        }
Пример #9
0
        public async Task BeginScreenCasting(ScreenCastRequest screenCastRequest)
        {
            var mode = AppMode.Unattended;

            try
            {
                Bitmap currentFrame  = null;
                Bitmap previousFrame = null;
                byte[] encodedImageBytes;
                var    fpsQueue = new Queue <DateTimeOffset>();
                mode = Conductor.Mode;
                var viewer = ServiceContainer.Instance.GetRequiredService <Viewer>();
                viewer.Name = screenCastRequest.RequesterName;
                viewer.ViewerConnectionID = screenCastRequest.ViewerID;

                Logger.Write($"Starting screen cast.  Requester: {viewer.Name}. Viewer ID: {viewer.ViewerConnectionID}.  App Mode: {mode}");

                Conductor.Viewers.AddOrUpdate(viewer.ViewerConnectionID, viewer, (id, v) => viewer);

                if (mode == AppMode.Normal)
                {
                    Conductor.InvokeViewerAdded(viewer);
                }

                if (mode == AppMode.Unattended && screenCastRequest.NotifyUser)
                {
                    SessionIndicator.Show();
                }

                await viewer.SendViewerConnected();

                await viewer.SendMachineName(Environment.MachineName);

                await viewer.SendScreenData(
                    viewer.Capturer.SelectedScreen,
                    viewer.Capturer.GetDisplayNames().ToArray());

                await viewer.SendScreenSize(viewer.Capturer.CurrentScreenBounds.Width,
                                            viewer.Capturer.CurrentScreenBounds.Height);

                await viewer.SendCursorChange(CursorIconWatcher.GetCurrentCursor());

                await viewer.SendWindowsSessions();

                viewer.Capturer.ScreenChanged += async(sender, bounds) =>
                {
                    await viewer.SendScreenSize(bounds.Width, bounds.Height);
                };

                using (var initialFrame = viewer.Capturer.GetNextFrame())
                {
                    await viewer.SendScreenCapture(
                        ImageUtils.EncodeBitmap(initialFrame, viewer.EncoderParams),
                        viewer.Capturer.CurrentScreenBounds.Left,
                        viewer.Capturer.CurrentScreenBounds.Top,
                        viewer.Capturer.CurrentScreenBounds.Width,
                        viewer.Capturer.CurrentScreenBounds.Height);
                }

                if (EnvironmentHelper.IsWindows)
                {
                    await viewer.InitializeWebRtc();
                }

                while (!viewer.DisconnectRequested && viewer.IsConnected)
                {
                    try
                    {
                        if (viewer.IsUsingWebRtcVideo)
                        {
                            Thread.Sleep(100);
                            continue;
                        }
                        if (viewer.IsStalled)
                        {
                            // Viewer isn't responding.  Abort sending.
                            break;
                        }

                        if (EnvironmentHelper.IsDebug)
                        {
                            while (fpsQueue.Any() && DateTimeOffset.Now - fpsQueue.Peek() > TimeSpan.FromSeconds(1))
                            {
                                fpsQueue.Dequeue();
                            }
                            fpsQueue.Enqueue(DateTimeOffset.Now);
                            Debug.WriteLine($"Capture FPS: {fpsQueue.Count}");
                        }

                        viewer.ThrottleIfNeeded();

                        if (currentFrame != null)
                        {
                            previousFrame?.Dispose();
                            previousFrame = (Bitmap)currentFrame.Clone();
                        }

                        currentFrame?.Dispose();
                        currentFrame = viewer.Capturer.GetNextFrame();

                        var diffAreas = ImageUtils.GetDiffAreas(currentFrame, previousFrame, viewer.Capturer.CaptureFullscreen);

                        if (diffAreas.Count == 0)
                        {
                            continue;
                        }

                        foreach (var diffArea in diffAreas)
                        {
                            using var newImage = currentFrame.Clone(diffArea, PixelFormat.Format32bppArgb);
                            if (viewer.Capturer.CaptureFullscreen)
                            {
                                viewer.Capturer.CaptureFullscreen = false;
                            }

                            encodedImageBytes = ImageUtils.EncodeBitmap(newImage, viewer.EncoderParams);

                            if (encodedImageBytes?.Length > 0)
                            {
                                await viewer.SendScreenCapture(encodedImageBytes, diffArea.Left, diffArea.Top, diffArea.Width, diffArea.Height);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Write(ex);
                    }
                }

                Logger.Write($"Ended screen cast.  Requester: {viewer.Name}. Viewer ID: {viewer.ViewerConnectionID}.");
                Conductor.Viewers.TryRemove(viewer.ViewerConnectionID, out _);
                viewer.Dispose();
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
            }
            finally
            {
                // Close if no one is viewing.
                if (Conductor.Viewers.Count == 0 && mode == AppMode.Unattended)
                {
                    await ShutdownService.Shutdown();
                }
            }
        }