mirror of
https://github.com/immense/Remotely.git
synced 2025-10-26 11:27:15 +00:00
Capture working.
This commit is contained in:
parent
724254b60a
commit
7a3f5a8f3f
@ -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}";
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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="&" 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="&">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=""" 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=""">'</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>
|
||||
@ -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);
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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
@ -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.");
|
||||
});
|
||||
|
||||
Loading…
Reference in New Issue
Block a user