From 33106672cd7e9fd6b41bef6448a4840d76a3c739 Mon Sep 17 00:00:00 2001 From: Jared Goodwin Date: Fri, 1 Mar 2019 09:01:16 -0800 Subject: [PATCH] Rebranding. --- Remotely_Agent/Properties/launchSettings.json | 3 +- .../Resources/Remotely_ScreenCast.exe | Bin 1304064 -> 1305088 bytes Remotely_Agent/Services/DeviceSocket.cs | 20 +- Remotely_ScreenCast/Capture/BitBltCapture.cs | 34 ++- Remotely_ScreenCast/Capture/DXCapture.cs | 259 +++++++++--------- Remotely_ScreenCast/Capture/ScreenCaster.cs | 2 +- Remotely_ScreenCast/Utilities/Logger.cs | 12 +- 7 files changed, 173 insertions(+), 157 deletions(-) diff --git a/Remotely_Agent/Properties/launchSettings.json b/Remotely_Agent/Properties/launchSettings.json index d1f214e8..60efa336 100644 --- a/Remotely_Agent/Properties/launchSettings.json +++ b/Remotely_Agent/Properties/launchSettings.json @@ -1,7 +1,8 @@ { "profiles": { "Agent": { - "commandName": "Project" + "commandName": "Project", + "nativeDebugging": true } } } \ No newline at end of file diff --git a/Remotely_Agent/Resources/Remotely_ScreenCast.exe b/Remotely_Agent/Resources/Remotely_ScreenCast.exe index 5f89315c65e6dd502baae3ddaedac0cf8711ebde..34cab60713d95b55578137588ebfd16e8df34b55 100644 GIT binary patch delta 31591 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 XHUBQ-KX$FEVng6_<6E`5(E0xW?-NDQ delta 30999 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 diff --git a/Remotely_Agent/Services/DeviceSocket.cs b/Remotely_Agent/Services/DeviceSocket.cs index 71e7b603..619963af 100644 --- a/Remotely_Agent/Services/DeviceSocket.cs +++ b/Remotely_Agent/Services/DeviceSocket.cs @@ -224,25 +224,7 @@ namespace Remotely_Agent.Services { Uninstaller.UninstallClient(); }); - hubConnection.On("LaunchRCInNewDesktop", async (string[] viewerIDs, string serviceID, string desktop) => - { - if (!IsServerVerified) - { - Logger.Write("Remote control attempted before server was verified."); - Uninstaller.UninstallClient(); - return; - } - var rcBinaryPath = Path.Combine(Utilities.AppDataDir, "remote_control", OSUtils.ScreenCastExecutableFileName); - var procInfo = new ADVAPI32.PROCESS_INFORMATION(); - var processResult = Win32Interop.OpenInteractiveProcess(rcBinaryPath + $" -mode desktopswitch -viewers {String.Join(",",viewerIDs)} -serviceid {serviceID} -desktop {desktop} -hostname {Utilities.GetConnectionInfo().Host.Split("//").Last()}", desktop, true, out procInfo); - if (!processResult) - { - foreach (var viewer in viewerIDs) - { - await hubConnection.InvokeAsync("DesktopSwitchFailed", viewer); - } - } - }); + hubConnection.On("RemoteControl", async (string requesterID, string serviceID) => { if (!IsServerVerified) diff --git a/Remotely_ScreenCast/Capture/BitBltCapture.cs b/Remotely_ScreenCast/Capture/BitBltCapture.cs index 5880232e..b1573b66 100644 --- a/Remotely_ScreenCast/Capture/BitBltCapture.cs +++ b/Remotely_ScreenCast/Capture/BitBltCapture.cs @@ -26,6 +26,7 @@ namespace Remotely_ScreenCast.Capture public int PauseForMilliseconds { get; set; } public EventHandler ScreenChanged { get; set; } private Stopwatch FramerateTimer { get; } = Stopwatch.StartNew(); + private object ScreenLock { get; } = new object(); public int SelectedScreen { get @@ -38,16 +39,21 @@ namespace Remotely_ScreenCast.Capture { return; } - if (Screen.AllScreens.Length >= value + 1) + lock (ScreenLock) { - selectedScreen = value; + if (Screen.AllScreens.Length >= value + 1) + { + selectedScreen = value; + } + else + { + selectedScreen = 0; + } + CurrentScreenBounds = Screen.AllScreens[selectedScreen].Bounds; + CaptureFullscreen = true; + Init(); + ScreenChanged?.Invoke(this, CurrentScreenBounds); } - else - { - selectedScreen = 0; - } - CurrentScreenBounds = Screen.AllScreens[selectedScreen].Bounds; - ScreenChanged?.Invoke(this, CurrentScreenBounds); } } public Rectangle CurrentScreenBounds { get; set; } = Screen.PrimaryScreen.Bounds; @@ -57,11 +63,16 @@ namespace Remotely_ScreenCast.Capture public BitBltCapture() + { + Init(); + } + + private void Init() { CurrentFrame = new Bitmap(CurrentScreenBounds.Width, CurrentScreenBounds.Height, PixelFormat.Format32bppArgb); PreviousFrame = new Bitmap(CurrentScreenBounds.Width, CurrentScreenBounds.Height, PixelFormat.Format32bppArgb); graphic = Graphics.FromImage(CurrentFrame); - desktopName = Win32Interop.GetCurrentDesktop(); + desktopName = Win32Interop.GetCurrentDesktop(); } public void Capture() @@ -87,7 +98,10 @@ namespace Remotely_ScreenCast.Capture try { - graphic.CopyFromScreen(0 + CurrentScreenBounds.Left, 0 + CurrentScreenBounds.Top, 0, 0, new Size(CurrentScreenBounds.Width, CurrentScreenBounds.Height)); + lock (ScreenLock) + { + graphic.CopyFromScreen(0 + CurrentScreenBounds.Left, 0 + CurrentScreenBounds.Top, 0, 0, new Size(CurrentScreenBounds.Width, CurrentScreenBounds.Height)); + } } catch (Exception ex) { diff --git a/Remotely_ScreenCast/Capture/DXCapture.cs b/Remotely_ScreenCast/Capture/DXCapture.cs index cb09f60f..c9ef8dd5 100644 --- a/Remotely_ScreenCast/Capture/DXCapture.cs +++ b/Remotely_ScreenCast/Capture/DXCapture.cs @@ -2,17 +2,12 @@ using SharpDX; using SharpDX.Direct3D11; using SharpDX.DXGI; -using SharpDX.Mathematics.Interop; using System; -using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; -using System.IO; using System.Linq; -using System.Text; using System.Threading; -using System.Threading.Tasks; using Win32; namespace Remotely_ScreenCast.Capture @@ -52,96 +47,107 @@ namespace Remotely_ScreenCast.Capture selectedScreen = 0; } } + CaptureFullscreen = true; NeedsInit = true; } } public bool NeedsInit { get; set; } = true; private string desktopName; - private Factory1 factory; - private Adapter1 adapter; - private SharpDX.Direct3D11.Device device; - private Output output; - private Output1 output1; - private int width; - private int height; - private Texture2DDescription textureDesc; - private Texture2D screenTexture; - private OutputDuplication duplicatedOutput; + private Factory1 factory; + private Adapter1 adapter; + private SharpDX.Direct3D11.Device device; + private Output output; + private Output1 output1; + private int width; + private int height; + private Texture2DDescription textureDesc; + private Texture2D screenTexture; + private OutputDuplication duplicatedOutput; private int selectedScreen = 0; + private object ScreenLock { get; } = new object(); private void Init() - { - desktopName = Win32Interop.GetCurrentDesktop(); - - factory = new Factory1(); - - //Get first adapter - adapter = factory.Adapters1.FirstOrDefault(x => x.Outputs.Length > 0); - //Get device from adapter - device = new SharpDX.Direct3D11.Device(adapter); - //Get front buffer of the adapter - if (adapter.GetOutputCount() < selectedScreen + 1) + { + try { - selectedScreen = 0; - } - output = adapter.GetOutput(selectedScreen); - output1 = output.QueryInterface(); + lock (ScreenLock) + { + desktopName = Win32Interop.GetCurrentDesktop(); + factory = new Factory1(); - // Width/Height of desktop to capture - var bounds = output.Description.DesktopBounds; - var newWidth = bounds.Right - bounds.Left; - var newHeight = bounds.Bottom - bounds.Top; - CurrentScreenBounds = new Rectangle(bounds.Left, bounds.Top, newWidth, newHeight); - if (newWidth != width || newHeight != height) + //Get first adapter + adapter = factory.Adapters1.FirstOrDefault(x => x.Outputs.Length > 0); + //Get device from adapter + device = new SharpDX.Direct3D11.Device(adapter); + //Get front buffer of the adapter + if (adapter.GetOutputCount() < selectedScreen + 1) + { + selectedScreen = 0; + } + output = adapter.GetOutput(selectedScreen); + output1 = output.QueryInterface(); + + // Width/Height of desktop to capture + var bounds = output.Description.DesktopBounds; + var newWidth = bounds.Right - bounds.Left; + var newHeight = bounds.Bottom - bounds.Top; + CurrentScreenBounds = new Rectangle(bounds.Left, bounds.Top, newWidth, newHeight); + if (newWidth != width || newHeight != height) + { + ScreenChanged?.Invoke(this, CurrentScreenBounds); + } + width = newWidth; + height = newHeight; + + CurrentFrame = new Bitmap(width, height); + PreviousFrame = new Bitmap(width, height); + + // Create Staging texture CPU-accessible + textureDesc = new Texture2DDescription + { + CpuAccessFlags = CpuAccessFlags.Read, + BindFlags = BindFlags.None, + Format = Format.B8G8R8A8_UNorm, + Width = width, + Height = height, + OptionFlags = ResourceOptionFlags.None, + MipLevels = 1, + ArraySize = 1, + SampleDescription = { Count = 1, Quality = 0 }, + Usage = ResourceUsage.Staging + }; + screenTexture = new Texture2D(device, textureDesc); + duplicatedOutput = output1.DuplicateOutput(device); + } + } + catch (Exception ex) { - ScreenChanged?.Invoke(this, CurrentScreenBounds); + Logger.Write(ex); } - width = newWidth; - height = newHeight; - - CurrentFrame = new Bitmap(width, height); - PreviousFrame = new Bitmap(width, height); - - // Create Staging texture CPU-accessible - textureDesc = new Texture2DDescription - { - CpuAccessFlags = CpuAccessFlags.Read, - BindFlags = BindFlags.None, - Format = Format.B8G8R8A8_UNorm, - Width = width, - Height = height, - OptionFlags = ResourceOptionFlags.None, - MipLevels = 1, - ArraySize = 1, - SampleDescription = { Count = 1, Quality = 0 }, - Usage = ResourceUsage.Staging - }; - screenTexture = new Texture2D(device, textureDesc); - duplicatedOutput = output1.DuplicateOutput(device); } - public void Capture() - { - try - { + public void Capture() + { + try + { if (NeedsInit) { Init(); NeedsInit = false; } - var currentDesktop = Win32Interop.GetCurrentDesktop(); - if (currentDesktop != desktopName) - { - desktopName = currentDesktop; - var inputDesktop = Win32Interop.OpenInputDesktop(); - var success = User32.SetThreadDesktop(inputDesktop); - User32.CloseDesktop(inputDesktop); - Logger.Write($"Set thread desktop to {currentDesktop}: {success}"); + var currentDesktop = Win32Interop.GetCurrentDesktop(); + if (currentDesktop != desktopName) + { + desktopName = currentDesktop; + var inputDesktop = Win32Interop.OpenInputDesktop(); + var success = User32.SetThreadDesktop(inputDesktop); + User32.CloseDesktop(inputDesktop); + Logger.Write($"Set thread desktop to {currentDesktop}: {success}"); return; - } + } - SharpDX.DXGI.Resource screenResource; - OutputDuplicateFrameInformation duplicateFrameInformation; + SharpDX.DXGI.Resource screenResource; + OutputDuplicateFrameInformation duplicateFrameInformation; // Keep framerate below 30 FPS. if (FramerateTimer.Elapsed.TotalMilliseconds > 33) @@ -150,67 +156,70 @@ namespace Remotely_ScreenCast.Capture } FramerateTimer.Restart(); - // Try to get duplicated frame within given time is ms - duplicatedOutput.AcquireNextFrame(50, out duplicateFrameInformation, out screenResource); + lock (ScreenLock) + { + // Try to get duplicated frame within given time is ms + duplicatedOutput.AcquireNextFrame(50, out duplicateFrameInformation, out screenResource); - while (duplicateFrameInformation.AccumulatedFrames < 1) - { - duplicatedOutput.ReleaseFrame(); - duplicatedOutput.AcquireNextFrame(50, out duplicateFrameInformation, out screenResource); - } + while (duplicateFrameInformation.AccumulatedFrames < 1) + { + duplicatedOutput.ReleaseFrame(); + duplicatedOutput.AcquireNextFrame(50, out duplicateFrameInformation, out screenResource); + } - // copy resource into memory that can be accessed by the CPU - using (var screenTexture2D = screenResource.QueryInterface()) - device.ImmediateContext.CopyResource(screenTexture2D, screenTexture); + // copy resource into memory that can be accessed by the CPU + using (var screenTexture2D = screenResource.QueryInterface()) + device.ImmediateContext.CopyResource(screenTexture2D, screenTexture); - // Get the desktop capture texture - var mapSource = device.ImmediateContext.MapSubresource(screenTexture, 0, MapMode.Read, SharpDX.Direct3D11.MapFlags.None); + // Get the desktop capture texture + var mapSource = device.ImmediateContext.MapSubresource(screenTexture, 0, MapMode.Read, SharpDX.Direct3D11.MapFlags.None); - // Create Drawing.Bitmap - using (var bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb)) - { - var boundsRect = new Rectangle(0, 0, width, height); + // Create Drawing.Bitmap + using (var bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb)) + { + var boundsRect = new Rectangle(0, 0, width, height); - // Copy pixels from screen capture Texture to GDI bitmap - var mapDest = bitmap.LockBits(boundsRect, ImageLockMode.WriteOnly, bitmap.PixelFormat); - var sourcePtr = mapSource.DataPointer; - var destPtr = mapDest.Scan0; - for (int y = 0; y < height; y++) - { - // Copy a single line - SharpDX.Utilities.CopyMemory(destPtr, sourcePtr, width * 4); + // Copy pixels from screen capture Texture to GDI bitmap + var mapDest = bitmap.LockBits(boundsRect, ImageLockMode.WriteOnly, bitmap.PixelFormat); + var sourcePtr = mapSource.DataPointer; + var destPtr = mapDest.Scan0; + for (int y = 0; y < height; y++) + { + // Copy a single line + SharpDX.Utilities.CopyMemory(destPtr, sourcePtr, width * 4); - // Advance pointers - sourcePtr = IntPtr.Add(sourcePtr, mapSource.RowPitch); - destPtr = IntPtr.Add(destPtr, mapDest.Stride); - } + // Advance pointers + sourcePtr = IntPtr.Add(sourcePtr, mapSource.RowPitch); + destPtr = IntPtr.Add(destPtr, mapDest.Stride); + } - // Release source and dest locks - bitmap.UnlockBits(mapDest); - device.ImmediateContext.UnmapSubresource(screenTexture, 0); + // Release source and dest locks + bitmap.UnlockBits(mapDest); + device.ImmediateContext.UnmapSubresource(screenTexture, 0); - PreviousFrame = (Bitmap)CurrentFrame.Clone(); - CurrentFrame = (Bitmap)bitmap.Clone(); + PreviousFrame = (Bitmap)CurrentFrame.Clone(); + CurrentFrame = (Bitmap)bitmap.Clone(); - screenResource.Dispose(); - duplicatedOutput.ReleaseFrame(); - } - } - catch (SharpDXException e) - { - if (e.ResultCode.Code != SharpDX.DXGI.ResultCode.WaitTimeout.Result.Code) - { + screenResource.Dispose(); + duplicatedOutput.ReleaseFrame(); + } + } + } + catch (SharpDXException e) + { + if (e.ResultCode.Code != SharpDX.DXGI.ResultCode.WaitTimeout.Result.Code) + { Logger.Write(e); - Init(); - Capture(); - } - } - catch (Exception e) - { + Init(); + Capture(); + } + } + catch (Exception e) + { Logger.Write(e); - Init(); - Capture(); - } - } + Init(); + Capture(); + } + } } } diff --git a/Remotely_ScreenCast/Capture/ScreenCaster.cs b/Remotely_ScreenCast/Capture/ScreenCaster.cs index 98be82c8..39fe8af8 100644 --- a/Remotely_ScreenCast/Capture/ScreenCaster.cs +++ b/Remotely_ScreenCast/Capture/ScreenCaster.cs @@ -62,7 +62,7 @@ namespace Remotely_ScreenCast.Capture } await outgoingMessages.SendScreenCount( - Screen.AllScreens.ToList().IndexOf(Screen.PrimaryScreen), + viewer.CurrentScreenIndex, Screen.AllScreens.Length, viewerID); diff --git a/Remotely_ScreenCast/Utilities/Logger.cs b/Remotely_ScreenCast/Utilities/Logger.cs index 6a219c84..96982575 100644 --- a/Remotely_ScreenCast/Utilities/Logger.cs +++ b/Remotely_ScreenCast/Utilities/Logger.cs @@ -30,7 +30,17 @@ namespace Remotely_ScreenCast.Utilities fi = new FileInfo(path); } } - File.AppendAllText(path, JsonConvert.SerializeObject(jsoninfo) + Environment.NewLine); + try + { + File.AppendAllText(path, JsonConvert.SerializeObject(jsoninfo) + Environment.NewLine); + } + catch + { + Task.Delay(1000).ContinueWith((Task task) => + { + Write(message); + }); + } } public static void Write(Exception ex)