From f17d39f37cac50861467e07a7bee40534d20100a Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Wed, 4 Mar 2020 21:32:42 +0200 Subject: Improved "Notify Continuous Requests About Disconnection". Integrated FSE/PPC Remote Desktop. Implemented RemoteDesktopService / RemoteDesktopProvider. Implemented Mouse/Keyboard gestures. --- .../RemoteDesktop/DefaultRemoteDesktopService.cs | 124 ++++++++++++++++----- 1 file changed, 98 insertions(+), 26 deletions(-) (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs') diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs index 67d0b85de..0d5bd8559 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Windows.Input; using Tango.Core; using Tango.Core.DI; using Tango.Integration.ExternalBridge; @@ -14,9 +15,11 @@ using Tango.RemoteDesktop.CaptureMethods; using Tango.RemoteDesktop.Encoders; using Tango.RemoteDesktop.Engines; using Tango.RemoteDesktop.Frames; +using Tango.RemoteDesktop.Input; using Tango.RemoteDesktop.Network; using Tango.Settings; using Tango.Transport; +using static Tango.RemoteDesktop.Input.MouseController; namespace Tango.PPC.Common.RemoteDesktop { @@ -45,6 +48,8 @@ namespace Tango.PPC.Common.RemoteDesktop _clients = new List(); _engine = new RasterScreenCaptureEngine(); + _engine.CaptureCursor = false; + _engine.FrameRate = Math.Min(Math.Max(_settings.RemoteDesktopFrameRate, 1), 20); _engine.FrameReceived += _engine_FrameReceived; } @@ -56,6 +61,16 @@ namespace Tango.PPC.Common.RemoteDesktop _engine.CaptureMethod.Dispose(); var mainWindow = System.Windows.Application.Current.MainWindow; + mainWindow.LocationChanged += (_, __) => + { + _engine.CaptureRegion = new CaptureRegion() + { + Left = (int)mainWindow.Left, + Top = (int)mainWindow.Top, + Width = (int)mainWindow.Width, + Height = (int)mainWindow.Height + }; + }; _engine.CaptureRegion = new CaptureRegion() { @@ -68,11 +83,6 @@ namespace Tango.PPC.Common.RemoteDesktop #endif _engine.Comparer.MaxDifferencesThrow = _engine.CaptureRegion.Width * _engine.CaptureRegion.Height / 2; - - if (_settings.EnableRemoteDesktop) - { - Start(); - } } private bool _isStarted; @@ -82,24 +92,6 @@ namespace Tango.PPC.Common.RemoteDesktop private set { _isStarted = value; RaisePropertyChangedAuto(); } } - public void Start() - { - if (!IsStarted) - { - _engine.Start(); - IsStarted = true; - } - } - - public void Stop() - { - if (IsStarted) - { - _engine.Stop(); - IsStarted = false; - } - } - [ExternalBridgeRequestHandlerMethod(typeof(StartRemoteDesktopSessionRequest))] public async void OnStartRemoteDesktopSessionRequestReceived(StartRemoteDesktopSessionRequest request, String token, ExternalBridgeReceiver receiver) { @@ -119,10 +111,85 @@ namespace Tango.PPC.Common.RemoteDesktop await receiver.SendGenericResponse(new StartRemoteDesktopSessionResponse() { FrameRate = _engine.FrameRate - }, token, new TransportResponseConfig() + }, token); + + if (_settings.EnableRemoteDesktop) { - Immediate = false, - }); + if (!_engine.IsStarted) + { + _engine.Start(); + } + } + } + + [ExternalBridgeRequestHandlerMethod(typeof(StopRemoteDesktopSessionRequest))] + public async void OnStopRemoteDesktopSessionRequestReceived(StopRemoteDesktopSessionRequest request, String token, ExternalBridgeReceiver receiver) + { + var client = _clients.SingleOrDefault(x => x.Receiver == receiver); + + if (client != null) + { + _clients.Remove(client); + } + + if (_clients.Count == 0) + { + _engine.Stop(); + } + + await receiver.SendGenericResponse(new StopRemoteDesktopSessionResponse(), token); + + if (client != null) + { + await receiver.SendGenericResponse(new StartRemoteDesktopSessionResponse(), client.Token, new TransportResponseConfig() { Completed = true }); + } + } + + [ExternalBridgeRequestHandlerMethod(typeof(MouseStateRequest))] + public async void OnMouseStateRequestReceived(MouseStateRequest request, String token, ExternalBridgeReceiver receiver) + { + MouseController.SetCursorPosition((int)request.Location.X, (int)request.Location.Y); + + if (request.EventType == MouseEventType.Up || request.EventType == MouseEventType.Down) + { + MouseEventFlags flag = MouseEventFlags.LeftUp; + + switch (request.EventType) + { + case MouseEventType.Down: + flag = request.Button == MouseButton.Right ? MouseEventFlags.RightDown : MouseEventFlags.LeftDown; + break; + case MouseEventType.Up: + flag = request.Button == MouseButton.Right ? MouseEventFlags.RightUp : MouseEventFlags.LeftUp; + break; + } + + MouseController.MouseEvent(flag); + } + else if (request.EventType == MouseEventType.DoubleClick) + { + MouseController.MouseEvent(MouseEventFlags.LeftDown); + MouseController.MouseEvent(MouseEventFlags.LeftUp); + MouseController.MouseEvent(MouseEventFlags.LeftDown); + MouseController.MouseEvent(MouseEventFlags.LeftUp); + } + + await receiver.SendGenericResponse(new MouseStateResponse(), token); + } + + [ExternalBridgeRequestHandlerMethod(typeof(KeyboardStateRequest))] + public async void OnKeyboardStateRequestReceived(KeyboardStateRequest request, String token, ExternalBridgeReceiver receiver) + { + if (request.EventType == KeyboardEventType.Down) + { + KeyboardController.KeyDown(request.Key, request.IsCtrlDown, request.IsShiftDown, request.IsAltDown); + } + else + { + KeyboardController.KeyUp(request.Key, request.IsCtrlDown, request.IsShiftDown, request.IsAltDown); + } + + await receiver.SendGenericResponse(new KeyboardStateResponse(), token); } private async void _engine_FrameReceived(object sender, ScreenCaptureFrameReceivedEventArgs e) @@ -211,6 +278,11 @@ namespace Tango.PPC.Common.RemoteDesktop { _clients.Remove(client); } + + if (_clients.Count == 0) + { + _engine.Stop(); + } } } } -- cgit v1.3.1