Capture working.

This commit is contained in:
Jared Goodwin 2019-03-06 16:31:22 -08:00
parent 724254b60a
commit 7a3f5a8f3f
14 changed files with 210 additions and 183 deletions

View File

@ -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}";

View File

@ -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);

View File

@ -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<string>() { viewerID });
while (!viewer.DisconnectRequested)
{
try

View File

@ -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());

View File

@ -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);
}

View File

@ -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);
}
}
}

View File

@ -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();

View File

@ -4,71 +4,71 @@
<button id="closeOSKButton">X</button>
</div>
<div class="osk-row">
<div class="osk-key" alt-key="~" keycode="192">`</div>
<div class="osk-key" alt-key="!" keycode="49">1</div>
<div class="osk-key" alt-key="@@" keycode="50">2</div>
<div class="osk-key" alt-key="#" keycode="51">3</div>
<div class="osk-key" alt-key="$" keycode="52">4</div>
<div class="osk-key" alt-key="%" keycode="53">5</div>
<div class="osk-key" alt-key="^" keycode="54">6</div>
<div class="osk-key" alt-key="&amp;" keycode="55">7</div>
<div class="osk-key" alt-key="*" keycode="56">8</div>
<div class="osk-key" alt-key="(" keycode="57">9</div>
<div class="osk-key" alt-key=")" keycode="48">0</div>
<div class="osk-key" alt-key="_" keycode="173">-</div>
<div class="osk-key" alt-key="+" keycode="61">=</div>
<div class="osk-key" alt-key="~">`</div>
<div class="osk-key" alt-key="!">1</div>
<div class="osk-key" alt-key="@@">2</div>
<div class="osk-key" alt-key="#">3</div>
<div class="osk-key" alt-key="$">4</div>
<div class="osk-key" alt-key="%">5</div>
<div class="osk-key" alt-key="^">6</div>
<div class="osk-key" alt-key="&amp;">7</div>
<div class="osk-key" alt-key="*">8</div>
<div class="osk-key" alt-key="(">9</div>
<div class="osk-key" alt-key=")">0</div>
<div class="osk-key" alt-key="_">-</div>
<div class="osk-key" alt-key="+">=</div>
</div>
<div class="osk-row">
<div class="osk-key" alt-key="Q" keycode="81">q</div>
<div class="osk-key" alt-key="W" keycode="87">w</div>
<div class="osk-key" alt-key="E" keycode="69">e</div>
<div class="osk-key" alt-key="R" keycode="82">r</div>
<div class="osk-key" alt-key="T" keycode="84">t</div>
<div class="osk-key" alt-key="Y" keycode="89">y</div>
<div class="osk-key" alt-key="U" keycode="85">u</div>
<div class="osk-key" alt-key="I" keycode="73">i</div>
<div class="osk-key" alt-key="O" keycode="79">o</div>
<div class="osk-key" alt-key="P" keycode="80">p</div>
<div class="osk-key" alt-key="{" keycode="219">[</div>
<div class="osk-key" alt-key="}" keycode="221">]</div>
<div class="osk-key" alt-key="|" keycode="220">\</div>
<div class="osk-key" alt-key="Q">q</div>
<div class="osk-key" alt-key="W">w</div>
<div class="osk-key" alt-key="E">e</div>
<div class="osk-key" alt-key="R">r</div>
<div class="osk-key" alt-key="T">t</div>
<div class="osk-key" alt-key="Y">y</div>
<div class="osk-key" alt-key="U">u</div>
<div class="osk-key" alt-key="I">i</div>
<div class="osk-key" alt-key="O">o</div>
<div class="osk-key" alt-key="P">p</div>
<div class="osk-key" alt-key="{">[</div>
<div class="osk-key" alt-key="}">]</div>
<div class="osk-key" alt-key="|">\</div>
</div>
<div class="osk-row">
<div class="osk-key" alt-key="A" keycode="65">a</div>
<div class="osk-key" alt-key="S" keycode="83">s</div>
<div class="osk-key" alt-key="D" keycode="68">d</div>
<div class="osk-key" alt-key="F" keycode="70">f</div>
<div class="osk-key" alt-key="G" keycode="71">g</div>
<div class="osk-key" alt-key="H" keycode="72">h</div>
<div class="osk-key" alt-key="J" keycode="74">j</div>
<div class="osk-key" alt-key="K" keycode="75">k</div>
<div class="osk-key" alt-key="L" keycode="76">l</div>
<div class="osk-key" alt-key=":" keycode="59">;</div>
<div class="osk-key" alt-key="&quot;" keycode="222">'</div>
<div class="osk-key wide-key-sm" keycode="13">Enter</div>
<div class="osk-key" alt-key="A">a</div>
<div class="osk-key" alt-key="S">s</div>
<div class="osk-key" alt-key="D">d</div>
<div class="osk-key" alt-key="F">f</div>
<div class="osk-key" alt-key="G">g</div>
<div class="osk-key" alt-key="H">h</div>
<div class="osk-key" alt-key="J">j</div>
<div class="osk-key" alt-key="K">k</div>
<div class="osk-key" alt-key="L">l</div>
<div class="osk-key" alt-key=":">;</div>
<div class="osk-key" alt-key="&quot;">'</div>
<div class="osk-key wide-key-sm">Enter</div>
</div>
<div class="osk-row">
<div id="shiftKey" class="osk-key wide-key-sm" keycode="16">Shift</div>
<div class="osk-key" alt-key="Z" keycode="90">z</div>
<div class="osk-key" alt-key="X" keycode="88">x</div>
<div class="osk-key" alt-key="C" keycode="67">c</div>
<div class="osk-key" alt-key="V" keycode="86">v</div>
<div class="osk-key" alt-key="B" keycode="66">b</div>
<div class="osk-key" alt-key="N" keycode="78">n</div>
<div class="osk-key" alt-key="M" keycode="77">m</div>
<div class="osk-key" alt-key="<" keycode="188">,</div>
<div class="osk-key" alt-key=">" keycode="190">.</div>
<div class="osk-key" alt-key="?" keycode="191">/</div>
<div id="shiftKey" class="osk-key wide-key-sm">Shift</div>
<div class="osk-key" alt-key="Z">z</div>
<div class="osk-key" alt-key="X">x</div>
<div class="osk-key" alt-key="C">c</div>
<div class="osk-key" alt-key="V">v</div>
<div class="osk-key" alt-key="B">b</div>
<div class="osk-key" alt-key="N">n</div>
<div class="osk-key" alt-key="M">m</div>
<div class="osk-key" alt-key="<">,</div>
<div class="osk-key" alt-key=">">.</div>
<div class="osk-key" alt-key="?">/</div>
</div>
<div class="osk-row">
<div id="ctrlKey" class="osk-key" keycode="17">Ctrl</div>
<div id="altKey" class="osk-key" keycode="18">Alt</div>
<div class="osk-key wide-key-lg" keycode="32">Space</div>
<div class="osk-key" keycode="37">Left</div>
<div class="osk-key" keycode="38">Up</div>
<div class="osk-key" keycode="40">Down</div>
<div class="osk-key" keycode="39">Right</div>
<div class="osk-key" keycode="8">Backspace</div>
<div id="ctrlKey" class="osk-key">Ctrl</div>
<div id="altKey" class="osk-key">Alt</div>
<div class="osk-key wide-key-lg">Space</div>
<div class="osk-key">Left</div>
<div class="osk-key">Up</div>
<div class="osk-key">Down</div>
<div class="osk-key">Right</div>
<div class="osk-key">Backspace</div>
</div>
</div>
<script src="~/scripts/RemoteControl/OSK.js" type="module"></script>

View File

@ -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);

View File

@ -16,37 +16,17 @@ namespace Remotely_Server.Services
public RCDeviceSocketHub(DataService dataService,
IHubContext<BrowserSocketHub> browserHub,
IHubContext<RCBrowserSocketHub> rcBrowserHub,
IHubContext<DeviceSocketHub> deviceSocketHub,
ApplicationConfig appConfig,
RandomGenerator rng)
IHubContext<DeviceSocketHub> deviceSocketHub)
{
DataService = dataService;
BrowserHub = browserHub;
RCBrowserHub = rcBrowserHub;
AppConfig = appConfig;
DeviceHub = deviceSocketHub;
RNG = rng;
}
private ApplicationConfig AppConfig { get; set; }
private IHubContext<DeviceSocketHub> DeviceHub { get; }
private DataService DataService { get; }
private IHubContext<BrowserSocketHub> BrowserHub { get; }
private IHubContext<RCBrowserSocketHub> 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<string> ViewerList
{
get
@ -58,8 +38,6 @@ namespace Remotely_Server.Services
return Context.Items["ViewerList"] as List<string>;
}
}
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()

View File

@ -138,13 +138,13 @@ namespace Remotely_Server
});
routes.MapHub<RCDeviceSocketHub>("/RCDeviceHub", options =>
{
options.ApplicationMaxBufferSize = 5000000;
options.TransportMaxBufferSize = 5000000;
options.ApplicationMaxBufferSize = 10000000;
options.TransportMaxBufferSize = 10000000;
});
routes.MapHub<RCBrowserSocketHub>("/RCBrowserHub", options =>
{
options.ApplicationMaxBufferSize = 5000000;
options.TransportMaxBufferSize = 5000000;
options.ApplicationMaxBufferSize = 10000000;
options.TransportMaxBufferSize = 10000000;
});
});
app.UseMvcWithDefaultRoute();

View File

@ -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.");

File diff suppressed because one or more lines are too long

View File

@ -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.");
});