diff --git a/Remotely_Agent/Services/DeviceSocket.cs b/Remotely_Agent/Services/DeviceSocket.cs index 7623f170..949181d2 100644 --- a/Remotely_Agent/Services/DeviceSocket.cs +++ b/Remotely_Agent/Services/DeviceSocket.cs @@ -240,33 +240,8 @@ namespace Remotely_Agent.Services await hubConnection.InvokeAsync("DisplayConsoleMessage", $"Remote control is only supported on Windows at this time.", requesterID); return; } - // Cleanup old files. - foreach (var file in Directory.GetFiles(Path.GetTempPath(), "Remotely_ScreenCast*")) - { - try - { - File.Delete(file); - } - catch { } - } - // Get temp file name. - var count = 0; - var filePath = Path.Combine(Path.GetTempPath(), "Remotely_ScreenCast.exe"); - while (File.Exists(filePath)) - { - filePath = Path.Combine(Path.GetTempPath(), $"Remotely_ScreenCast{count}.exe"); - count++; - } - - // Extract ScreenCast. - using (var mrs = Assembly.GetExecutingAssembly().GetManifestResourceStream("Remotely_Agent.Resources.Remotely_ScreenCast.exe")) - { - using (var fs = new FileStream(filePath, FileMode.Create)) - { - mrs.CopyTo(fs); - } - } + var filePath = ExtractScreenCasterEXE(); // Start ScreenCast. await hubConnection.InvokeAsync("DisplayConsoleMessage", $"Starting remote control...", requesterID); @@ -285,7 +260,6 @@ namespace Remotely_Agent.Services await hubConnection.InvokeAsync("DisplayConsoleMessage", "Remote control failed to start on target device.", requesterID); } } - } //else if (OSUtils.IsLinux) //{ @@ -301,6 +275,7 @@ namespace Remotely_Agent.Services throw; } }); + hubConnection.On("CtrlAltDel", () => { User32.SendSAS(false); @@ -321,6 +296,39 @@ namespace Remotely_Agent.Services } }); } + + private static string ExtractScreenCasterEXE() + { + // Cleanup old files. + foreach (var file in Directory.GetFiles(Path.GetTempPath(), "Remotely_ScreenCast*")) + { + try + { + File.Delete(file); + } + catch { } + } + + // Get temp file name. + var count = 0; + var filePath = Path.Combine(Path.GetTempPath(), "Remotely_ScreenCast.exe"); + while (File.Exists(filePath)) + { + filePath = Path.Combine(Path.GetTempPath(), $"Remotely_ScreenCast{count}.exe"); + count++; + } + + // Extract ScreenCast. + using (var mrs = Assembly.GetExecutingAssembly().GetManifestResourceStream("Remotely_Agent.Resources.Remotely_ScreenCast.exe")) + { + using (var fs = new FileStream(filePath, FileMode.Create)) + { + mrs.CopyTo(fs); + } + } + return filePath; + } + private static void SendResultsViaAjax(string resultType, object result) { var targetURL = Utilities.GetConnectionInfo().Host + $"/API/Commands/{resultType}"; diff --git a/Remotely_ScreenCast/Capture/CursorIconWatcher.cs b/Remotely_ScreenCast/Capture/CursorIconWatcher.cs index 0967c500..3c4ab4dc 100644 --- a/Remotely_ScreenCast/Capture/CursorIconWatcher.cs +++ b/Remotely_ScreenCast/Capture/CursorIconWatcher.cs @@ -21,6 +21,15 @@ namespace Remotely_ScreenCast.Capture private System.Timers.Timer ChangeTimer { get; set; } private int PreviousCursorHandle { get; set; } private User32.CursorInfo cursorInfo; + + + public int GetCurrentCursor() + { + var ci = new User32.CursorInfo(); + ci.cbSize = Marshal.SizeOf(ci); + User32.GetCursorInfo(out ci); + return ci.hCursor.ToInt32(); + } private CursorIconWatcher() { ChangeTimer = new System.Timers.Timer(100); diff --git a/Remotely_ScreenCast/Capture/ScreenCaster.cs b/Remotely_ScreenCast/Capture/ScreenCaster.cs index 15a4ec5e..236c365d 100644 --- a/Remotely_ScreenCast/Capture/ScreenCaster.cs +++ b/Remotely_ScreenCast/Capture/ScreenCaster.cs @@ -14,8 +14,7 @@ namespace Remotely_ScreenCast.Capture { public class ScreenCaster { - public static async void BeginScreenCasting(HubConnection hubConnection, - string viewerID, + public static async void BeginScreenCasting(string viewerID, string requesterName, OutgoingMessages outgoingMessages) { @@ -38,8 +37,8 @@ namespace Remotely_ScreenCast.Capture catch (Exception ex) { Logger.Write(ex); - capturer = new BitBltCapture(); - captureMode = CaptureMode.BitBtl; + capturer = new BitBltCapture(); + captureMode = CaptureMode.BitBtl; } Logger.Write($"Starting screen cast. Requester: {requesterName}. Viewer ID: {viewerID}. Capture Mode: {captureMode.ToString()}. App Mode: {Program.Mode} Desktop: {Win32Interop.GetCurrentDesktop()}"); @@ -54,7 +53,6 @@ namespace Remotely_ScreenCast.Capture HasControl = Program.Mode == Enums.AppMode.Unattended }; - var success = false; while (!success) { @@ -72,7 +70,9 @@ namespace Remotely_ScreenCast.Capture { await outgoingMessages.SendScreenSize(bounds.Width, bounds.Height, viewerID); }; - + + await outgoingMessages.SendCursorChange(CursorIconWatcher.Current.GetCurrentCursor(), new List() { viewerID }); + while (!viewer.DisconnectRequested) { try diff --git a/Remotely_ScreenCast/Program.cs b/Remotely_ScreenCast/Program.cs index 49a4758a..f55600e9 100644 --- a/Remotely_ScreenCast/Program.cs +++ b/Remotely_ScreenCast/Program.cs @@ -50,15 +50,21 @@ namespace Remotely_ScreenCast Connection.StartAsync().Wait(); + OutgoingMessages = new OutgoingMessages(Connection); + var desktopName = Win32Interop.GetCurrentDesktop(); if (desktopName.ToLower() != CurrentDesktopName.ToLower()) { - RelaunchInCurrentDesktop(desktopName).Wait(); + CurrentDesktopName = desktopName; + Logger.Write($"Relaunching in desktop {desktopName}."); + var result = Win32Interop.OpenInteractiveProcess(Assembly.GetExecutingAssembly().Location + $" -mode {Mode.ToString()} -requester {RequesterID} -serviceid {ServiceID} -host {Host} -desktop {desktopName}", desktopName, true, out _); + if (!result) + { + Logger.Write($"Desktop relaunch to {desktopName} failed."); + } Environment.Exit(0); } - OutgoingMessages = new OutgoingMessages(Connection); - MessageHandlers.ApplyConnectionHandlers(Connection, OutgoingMessages); CursorIconWatcher.Current.OnChange += CursorIconWatcher_OnChange; @@ -67,11 +73,7 @@ namespace Remotely_ScreenCast { var viewersString = argDict["viewers"]; var viewerIDs = viewersString.Split(",".ToCharArray()); - foreach (var id in viewerIDs) - { - ScreenCaster.BeginScreenCasting(Connection, id, null, OutgoingMessages); - } - // TODO. + OutgoingMessages.NotifyViewersDesktopSwitchReady(viewerIDs).Wait(); } else { @@ -85,10 +87,16 @@ namespace Remotely_ScreenCast if (Mode == AppMode.Unattended) { desktopName = Win32Interop.GetCurrentDesktop(); - if (desktopName.ToLower() != CurrentDesktopName.ToLower()) + if (desktopName.ToLower() != CurrentDesktopName.ToLower() && Viewers.Count > 0) { - SwitchDesktops(desktopName).Wait(); - Environment.Exit(0); + CurrentDesktopName = desktopName; + Logger.Write($"Switching desktops to {desktopName}."); + Connection.InvokeAsync("SwitchingDesktops", Viewers.Keys.ToList()).Wait(); + var result = Win32Interop.OpenInteractiveProcess(Assembly.GetExecutingAssembly().Location + $" -mode {Mode.ToString()} -requester {RequesterID} -serviceid {ServiceID} -host {Host} -desktopswitch true -desktop {desktopName} -viewers {String.Join(",", Viewers.Keys.ToList())}", desktopName, true, out _); + if (!result) + { + Logger.Write($"Desktop switch to {desktopName} failed."); + } } System.Threading.Thread.Sleep(100); } @@ -104,29 +112,6 @@ namespace Remotely_ScreenCast } } - private static async Task RelaunchInCurrentDesktop(string desktopName) - { - var result = Win32Interop.OpenInteractiveProcess(Assembly.GetExecutingAssembly().Location + $" -mode {Mode.ToString()} -requester {RequesterID} -serviceid {ServiceID} -host {Host} -desktop {desktopName}", desktopName, true, out _); - if (!result) - { - // TODO. - //await Connection.InvokeAsync("DisplayMessage", "Remote control failed to start on target device.", RequesterID); - } - await Task.Delay(1); - } - - private static async Task SwitchDesktops(string desktopName) - { - Logger.Write($"Switching desktops to {desktopName}."); - await Connection.InvokeAsync("SwitchDesktops"); - var result = Win32Interop.OpenInteractiveProcess(Assembly.GetExecutingAssembly().Location + $" -mode {Mode.ToString()} -requester {RequesterID} -serviceid {ServiceID} -host {Host} -desktopswitch true -desktop {desktopName} -viewers {String.Join(",", Viewers.Keys.ToList())}", desktopName, true, out _); - if (!result) - { - // TODO. - //await Connection.InvokeAsync("DisplayMessage", "Desktop switch failed on target device.", RequesterID); - } - } - private static async void CursorIconWatcher_OnChange(object sender, int cursor) { await OutgoingMessages.SendCursorChange(cursor, Viewers.Keys.ToList()); diff --git a/Remotely_ScreenCast/Sockets/MessageHandlers.cs b/Remotely_ScreenCast/Sockets/MessageHandlers.cs index 9c1a33e5..83c5ab47 100644 --- a/Remotely_ScreenCast/Sockets/MessageHandlers.cs +++ b/Remotely_ScreenCast/Sockets/MessageHandlers.cs @@ -30,7 +30,7 @@ namespace Remotely_ScreenCast.Sockets { try { - ScreenCaster.BeginScreenCasting(hubConnection, viewerID, requesterName, outgoingMessages); + ScreenCaster.BeginScreenCasting(viewerID, requesterName, outgoingMessages); } catch (Exception ex) { @@ -42,8 +42,17 @@ namespace Remotely_ScreenCast.Sockets { if (Program.Viewers.TryGetValue(viewerID, out var viewer) && viewer.HasControl) { + //var converter = new KeysConverter(); + //try + //{ + // var key = (Keys)converter.ConvertFromString(keyCode.ToString()); + // Win32Interop.SendKeyDown(key); + //} + //catch + //{ + // Logger.Write($"Failed to convert key {keyCode}."); + //} Win32Interop.SendKeyDown((User32.VirtualKeyShort)keyCode); - //User32.SendKeyDown((User32.VirtualKeyShort)KeyInterop.VirtualKeyFromKey((Key)Enum.Parse(typeof(Key), key))); } }); @@ -51,8 +60,17 @@ namespace Remotely_ScreenCast.Sockets { if (Program.Viewers.TryGetValue(viewerID, out var viewer) && viewer.HasControl) { + //var converter = new KeysConverter(); + //try + //{ + // var key = (Keys)converter.ConvertFromString(keyCode.ToString()); + // Win32Interop.SendKeyDown(key); + //} + //catch + //{ + // Logger.Write($"Failed to convert key {keyCode}."); + //} Win32Interop.SendKeyUp((User32.VirtualKeyShort)keyCode); - //User32.SendKeyDown((User32.VirtualKeyShort)KeyInterop.VirtualKeyFromKey((Key)Enum.Parse(typeof(Key), key))); } }); @@ -60,7 +78,17 @@ namespace Remotely_ScreenCast.Sockets { if (Program.Viewers.TryGetValue(viewerID, out var viewer) && viewer.HasControl) { - + //var converter = new KeysConverter(); + //try + //{ + // var key = (Keys)converter.ConvertFromString(keyCode.ToString()); + // Win32Interop.SendKeyDown(key); + // Win32Interop.SendKeyUp(key); + //} + //catch + //{ + // Logger.Write($"Failed to convert key {keyCode}."); + //} Win32Interop.SendKeyDown((User32.VirtualKeyShort)keyCode); Win32Interop.SendKeyUp((User32.VirtualKeyShort)keyCode); } diff --git a/Remotely_ScreenCast/Sockets/OutgoingMessages.cs b/Remotely_ScreenCast/Sockets/OutgoingMessages.cs index 6a32fd32..2293c284 100644 --- a/Remotely_ScreenCast/Sockets/OutgoingMessages.cs +++ b/Remotely_ScreenCast/Sockets/OutgoingMessages.cs @@ -39,5 +39,10 @@ namespace Remotely_ScreenCast.Sockets { await Connection.SendAsync("SendCursorChange", cursor, viewerIDs); } + + internal async Task NotifyViewersDesktopSwitchReady(string[] viewerIDs) + { + await Connection.SendAsync("NotifyViewersDesktopSwitchReady", viewerIDs); + } } } diff --git a/Remotely_Server/Data/DataService.cs b/Remotely_Server/Data/DataService.cs index ca686f3a..47c1a80f 100644 --- a/Remotely_Server/Data/DataService.cs +++ b/Remotely_Server/Data/DataService.cs @@ -291,6 +291,17 @@ namespace Remotely_Server.Data RemotelyContext.SaveChanges(); } + public void WriteEvent(string message) + { + RemotelyContext.EventLogs.Add(new EventLog() + { + EventType = EventTypes.Info, + Message = message, + TimeStamp = DateTime.Now + }); + RemotelyContext.SaveChanges(); + } + internal InviteLink AddInvite(string requesterUserName, Invite invite, string requestOrigin) { invite.InvitedUser = invite.InvitedUser.ToLower(); diff --git a/Remotely_Server/Pages/_OSK.cshtml b/Remotely_Server/Pages/_OSK.cshtml index 00c8809d..3357b096 100644 --- a/Remotely_Server/Pages/_OSK.cshtml +++ b/Remotely_Server/Pages/_OSK.cshtml @@ -4,71 +4,71 @@
-
`
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
0
-
-
-
=
+
`
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
0
+
-
+
=
-
q
-
w
-
e
-
r
-
t
-
y
-
u
-
i
-
o
-
p
-
[
-
]
-
\
+
q
+
w
+
e
+
r
+
t
+
y
+
u
+
i
+
o
+
p
+
[
+
]
+
\
-
a
-
s
-
d
-
f
-
g
-
h
-
j
-
k
-
l
-
;
-
'
-
Enter
+
a
+
s
+
d
+
f
+
g
+
h
+
j
+
k
+
l
+
;
+
'
+
Enter
-
Shift
-
z
-
x
-
c
-
v
-
b
-
n
-
m
-
,
-
.
-
/
+
Shift
+
z
+
x
+
c
+
v
+
b
+
n
+
m
+
,
+
.
+
/
-
Ctrl
-
Alt
-
Space
-
Left
-
Up
-
Down
-
Right
-
Backspace
+
Ctrl
+
Alt
+
Space
+
Left
+
Up
+
Down
+
Right
+
Backspace
\ No newline at end of file diff --git a/Remotely_Server/Services/RCBrowserSocketHub.cs b/Remotely_Server/Services/RCBrowserSocketHub.cs index dce57506..ce50891c 100644 --- a/Remotely_Server/Services/RCBrowserSocketHub.cs +++ b/Remotely_Server/Services/RCBrowserSocketHub.cs @@ -150,10 +150,7 @@ namespace Remotely_Server.Services Context.Items["RequesterName"] = requesterName; await RCDeviceHub.Clients.Client(clientID).SendAsync("GetScreenCast", Context.ConnectionId, requesterName); } - public void SwitchDesktops(string newClientID) - { - ClientID = newClientID; - } + public async Task SendFrameSkip(int delayTime) { await RCDeviceHub.Clients.Client(ClientID).SendAsync("FrameSkip", delayTime, Context.ConnectionId); diff --git a/Remotely_Server/Services/RCDeviceSocketHub.cs b/Remotely_Server/Services/RCDeviceSocketHub.cs index 9ef08141..91b0fd1b 100644 --- a/Remotely_Server/Services/RCDeviceSocketHub.cs +++ b/Remotely_Server/Services/RCDeviceSocketHub.cs @@ -16,37 +16,17 @@ namespace Remotely_Server.Services public RCDeviceSocketHub(DataService dataService, IHubContext browserHub, IHubContext rcBrowserHub, - IHubContext deviceSocketHub, - ApplicationConfig appConfig, - RandomGenerator rng) + IHubContext deviceSocketHub) { DataService = dataService; BrowserHub = browserHub; RCBrowserHub = rcBrowserHub; - AppConfig = appConfig; DeviceHub = deviceSocketHub; - RNG = rng; } - private ApplicationConfig AppConfig { get; set; } private IHubContext DeviceHub { get; } private DataService DataService { get; } private IHubContext BrowserHub { get; } private IHubContext RCBrowserHub { get; } - private bool IsSwitchingDesktops - { - get - { - if (!Context.Items.ContainsKey("IsSwitchingDesktops")) - { - Context.Items["IsSwitchingDesktops"] = false; - } - return (bool)Context.Items["IsSwitchingDesktops"]; - } - set - { - Context.Items["IsSwitchingDesktops"] = value; - } - } private List ViewerList { get @@ -58,8 +38,6 @@ namespace Remotely_Server.Services return Context.Items["ViewerList"] as List; } } - - private RandomGenerator RNG { get; } public override Task OnConnectedAsync() { @@ -67,10 +45,7 @@ namespace Remotely_Server.Services } public override async Task OnDisconnectedAsync(Exception exception) { - if (!IsSwitchingDesktops) - { - await RCBrowserHub.Clients.Clients(ViewerList).SendAsync("ScreenCasterDisconnected"); - } + await RCBrowserHub.Clients.Clients(ViewerList).SendAsync("ScreenCasterDisconnected"); if (Context.Items.ContainsKey("SessionID") && AttendedSessionList.ContainsKey(Context.Items["SessionID"].ToString())) { while (!AttendedSessionList.TryRemove(Context.Items["SessionID"].ToString(), out var value)) @@ -78,7 +53,7 @@ namespace Remotely_Server.Services await Task.Delay(1000); } } - + DataService.WriteEvent(exception); await base.OnDisconnectedAsync(exception); } public void ViewerDisconnected(string viewerID) @@ -102,15 +77,19 @@ namespace Remotely_Server.Services await RCBrowserHub.Clients.Client(rcBrowserHubConnectionID).SendAsync("ScreenSize", width, height); } - public async Task SendScreenCapture(byte[] captureBytes, string rcBrowserHubConnectionID, DateTime captureTime) + public Task SendScreenCapture(byte[] captureBytes, string rcBrowserHubConnectionID, DateTime captureTime) { - await RCBrowserHub.Clients.Client(rcBrowserHubConnectionID).SendAsync("ScreenCapture", captureBytes, captureTime); + return RCBrowserHub.Clients.Client(rcBrowserHubConnectionID).SendAsync("ScreenCapture", captureBytes, captureTime); } public async Task NotifyRequesterUnattendedReady(string browserHubConnectionID) { await BrowserHub.Clients.Client(browserHubConnectionID).SendAsync("UnattendedSessionReady", Context.ConnectionId); } + public async Task NotifyViewersDesktopSwitchReady(string[] viewerIDs) + { + await RCBrowserHub.Clients.Clients(viewerIDs).SendAsync("DesktopSwitchReady", Context.ConnectionId); + } public async Task SendConnectionFailedToBrowser(string rcBrowserHubConnectionID) { await RCBrowserHub.Clients.Client(rcBrowserHubConnectionID).SendAsync("ConnectionFailed"); @@ -121,9 +100,9 @@ namespace Remotely_Server.Services await RCBrowserHub.Clients.Clients(viewerIDs).SendAsync("CursorChange", cursor); } - public void SwitchDesktops() + public async Task SwitchingDesktops(string[] viewerIDs) { - IsSwitchingDesktops = true; + await RCBrowserHub.Clients.Clients(viewerIDs).SendAsync("SwitchingDesktops"); } public async Task GetSessionID() diff --git a/Remotely_Server/Startup.cs b/Remotely_Server/Startup.cs index 68db4fb5..80c523be 100644 --- a/Remotely_Server/Startup.cs +++ b/Remotely_Server/Startup.cs @@ -138,13 +138,13 @@ namespace Remotely_Server }); routes.MapHub("/RCDeviceHub", options => { - options.ApplicationMaxBufferSize = 5000000; - options.TransportMaxBufferSize = 5000000; + options.ApplicationMaxBufferSize = 10000000; + options.TransportMaxBufferSize = 10000000; }); routes.MapHub("/RCBrowserHub", options => { - options.ApplicationMaxBufferSize = 5000000; - options.TransportMaxBufferSize = 5000000; + options.ApplicationMaxBufferSize = 10000000; + options.TransportMaxBufferSize = 10000000; }); }); app.UseMvcWithDefaultRoute(); diff --git a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js index 570ea418..4e0f66f2 100644 --- a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js +++ b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js @@ -2,6 +2,7 @@ import * as UI from "./UI.js"; import { RemoteControl } from "./RemoteControl.js"; import { GetCursor } from "./CursorMap.js"; var signalR = window["signalR"]; +var lastFrameDelay = Date.now(); export class RCBrowserSockets { Connect() { this.Connection = new signalR.HubConnectionBuilder() @@ -106,8 +107,9 @@ export class RCBrowserSockets { hubConnection.on("ScreenCapture", (buffer, captureTime) => { var img = new Image(); img.onload = () => { + lastFrameDelay = Date.now(); var frameDelay = Date.now() - new Date(captureTime).getTime(); - if (frameDelay > 1000) { + if (frameDelay > 2000 && Date.now() - lastFrameDelay > 2000) { this.SendFrameSkip(frameDelay * .25); } UI.Screen2DContext.drawImage(img, 0, 0); @@ -125,13 +127,13 @@ export class RCBrowserSockets { hubConnection.on("ScreenCasterDisconnected", () => { this.Connection.stop(); }); - hubConnection.on("DesktopSwitching", () => { - UI.ShowMessage("Desktop switching in progress..."); - }); - hubConnection.on("SwitchedDesktop", (newClientID) => { - UI.ShowMessage("Desktop switch completed."); + hubConnection.on("DesktopSwitchReady", (newClientID) => { RemoteControl.ClientID = newClientID; - this.SendScreenCastRequestToDevice(); + this.Connection.stop(); + this.Connect(); + }); + hubConnection.on("SwitchingDesktops", () => { + UI.ShowMessage("Switching desktops..."); }); hubConnection.on("DesktopSwitchFailed", () => { UI.ShowMessage("Desktop switch failed. Please reconnect."); diff --git a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map index cb47ca05..4cb54d6e 100644 --- a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map +++ b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map @@ -1 +1 @@ -{"version":3,"file":"RCBrowserSockets.js","sourceRoot":"","sources":["RCBrowserSockets.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"RCBrowserSockets.js","sourceRoot":"","sources":["RCBrowserSockets.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts index cac91bbd..250e2c3c 100644 --- a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts +++ b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts @@ -5,6 +5,7 @@ import { RemoteControl } from "./RemoteControl.js"; import { GetCursor } from "./CursorMap.js"; var signalR = window["signalR"]; +var lastFrameDelay = Date.now(); export class RCBrowserSockets { Connection: any; @@ -114,8 +115,9 @@ export class RCBrowserSockets { hubConnection.on("ScreenCapture", (buffer: string, captureTime: string) => { var img = new Image(); img.onload = () => { + lastFrameDelay = Date.now(); var frameDelay = Date.now() - new Date(captureTime).getTime(); - if (frameDelay > 1000) { + if (frameDelay > 2000 && Date.now() - lastFrameDelay > 2000) { this.SendFrameSkip(frameDelay * .25); } UI.Screen2DContext.drawImage(img, 0, 0); @@ -133,14 +135,15 @@ export class RCBrowserSockets { hubConnection.on("ScreenCasterDisconnected", () => { this.Connection.stop(); }); - hubConnection.on("DesktopSwitching", () => { - UI.ShowMessage("Desktop switching in progress..."); - }); - hubConnection.on("SwitchedDesktop", (newClientID: string) => { - UI.ShowMessage("Desktop switch completed."); + hubConnection.on("DesktopSwitchReady", (newClientID: string) => { RemoteControl.ClientID = newClientID; - this.SendScreenCastRequestToDevice(); + this.Connection.stop(); + this.Connect(); + }) + hubConnection.on("SwitchingDesktops", () => { + UI.ShowMessage("Switching desktops..."); }); + hubConnection.on("DesktopSwitchFailed", () => { UI.ShowMessage("Desktop switch failed. Please reconnect."); });