From 5e0aafa7259e7680da37801fc21f3e04293805ed Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sun, 14 Jun 2026 23:55:10 +0200 Subject: [PATCH 1/3] Feature: Remote Desktop - View Only mode --- .../Resources/Strings.Designer.cs | 20 ++- .../Resources/Strings.resx | 6 + .../RemoteDesktop/RemoteDesktopSessionInfo.cs | 4 + .../Application/RemoteDesktop.cs | 9 ++ Source/NETworkManager.Profiles/GroupInfo.cs | 4 + Source/NETworkManager.Profiles/ProfileInfo.cs | 4 + .../GlobalStaticConfiguration.cs | 1 + .../NETworkManager.Settings/SettingsInfo.cs | 13 ++ .../Controls/DragablzTabHostWindow.xaml | 51 ++++++- .../Controls/DragablzTabHostWindow.xaml.cs | 22 ++- .../Controls/RemoteDesktopControl.xaml.cs | 65 +++++++++ Source/NETworkManager/ProfileDialogManager.cs | 4 + .../ViewModels/GroupViewModel.cs | 28 ++++ .../ViewModels/ProfileViewModel.cs | 28 ++++ .../RemoteDesktopConnectViewModel.cs | 17 ++- .../ViewModels/RemoteDesktopHostViewModel.cs | 27 +++- .../RemoteDesktopSettingsViewModel.cs | 17 +++ .../Views/GroupChildWindow.xaml | 127 ++++++++++-------- .../Views/ProfileChildWindow.xaml | 125 +++++++++-------- .../RemoteDesktopConnectChildWindow.xaml | 4 + .../Views/RemoteDesktopHostView.xaml | 43 +++++- .../Views/RemoteDesktopSettingsView.xaml | 3 + Website/docs/application/remote-desktop.md | 39 +++++- Website/docs/changelog/next-release.md | 4 + 24 files changed, 533 insertions(+), 132 deletions(-) diff --git a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs index a6e70ad0e0..9ddb2ab8bf 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs +++ b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs @@ -12279,7 +12279,25 @@ public static string VisualStyles { return ResourceManager.GetString("VisualStyles", resourceCulture); } } - + + /// + /// Looks up a localized string similar to View only. + /// + public static string ViewOnly { + get { + return ResourceManager.GetString("ViewOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Block keyboard and mouse input to the remote session. + /// + public static string ViewOnlyDescription { + get { + return ResourceManager.GetString("ViewOnlyDescription", resourceCulture); + } + } + /// /// Looks up a localized string similar to VLAN. /// diff --git a/Source/NETworkManager.Localization/Resources/Strings.resx b/Source/NETworkManager.Localization/Resources/Strings.resx index 28fe9f6281..5f30429e61 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.resx @@ -2142,6 +2142,12 @@ is disabled! Visual styles + + View only + + + Block keyboard and mouse input to the remote session + Remote audio diff --git a/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopSessionInfo.cs b/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopSessionInfo.cs index 106a19b7be..965a5abfa7 100644 --- a/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopSessionInfo.cs +++ b/Source/NETworkManager.Models/RemoteDesktop/RemoteDesktopSessionInfo.cs @@ -16,6 +16,10 @@ public class RemoteDesktopSessionInfo public int DesktopWidth { get; set; } public int DesktopHeight { get; set; } public int ColorDepth { get; set; } + + // View only (block keyboard and mouse input to the remote session) + public bool ViewOnly { get; set; } + public bool EnableCredSspSupport { get; set; } public uint AuthenticationLevel { get; set; } public bool EnableGatewayServer { get; set; } diff --git a/Source/NETworkManager.Profiles/Application/RemoteDesktop.cs b/Source/NETworkManager.Profiles/Application/RemoteDesktop.cs index c8240d2a3f..304dfdd75f 100644 --- a/Source/NETworkManager.Profiles/Application/RemoteDesktop.cs +++ b/Source/NETworkManager.Profiles/Application/RemoteDesktop.cs @@ -26,6 +26,9 @@ public static RemoteDesktopSessionInfo CreateSessionInfo() : SettingsManager.Current.RemoteDesktop_ScreenHeight, ColorDepth = SettingsManager.Current.RemoteDesktop_ColorDepth, + // View only + ViewOnly = SettingsManager.Current.RemoteDesktop_ViewOnly, + // Authentication EnableCredSspSupport = SettingsManager.Current.RemoteDesktop_EnableCredSspSupport, AuthenticationLevel = SettingsManager.Current.RemoteDesktop_AuthenticationLevel, @@ -128,6 +131,12 @@ public static RemoteDesktopSessionInfo CreateSessionInfo(ProfileInfo profile) info.ColorDepth = group.RemoteDesktop_ColorDepth; } + // View only + if (profile.RemoteDesktop_OverrideViewOnly) + info.ViewOnly = profile.RemoteDesktop_ViewOnly; + else if (group.RemoteDesktop_OverrideViewOnly) + info.ViewOnly = group.RemoteDesktop_ViewOnly; + // Authentication if (profile.RemoteDesktop_OverrideCredSspSupport) info.EnableCredSspSupport = profile.RemoteDesktop_EnableCredSspSupport; diff --git a/Source/NETworkManager.Profiles/GroupInfo.cs b/Source/NETworkManager.Profiles/GroupInfo.cs index 2598a48d05..4842bcccc2 100644 --- a/Source/NETworkManager.Profiles/GroupInfo.cs +++ b/Source/NETworkManager.Profiles/GroupInfo.cs @@ -60,6 +60,8 @@ public GroupInfo(GroupInfo group) : this(group.Name) RemoteDesktop_ColorDepth = group.RemoteDesktop_ColorDepth; RemoteDesktop_OverridePort = group.RemoteDesktop_OverridePort; RemoteDesktop_Port = group.RemoteDesktop_Port; + RemoteDesktop_OverrideViewOnly = group.RemoteDesktop_OverrideViewOnly; + RemoteDesktop_ViewOnly = group.RemoteDesktop_ViewOnly; RemoteDesktop_OverrideCredSspSupport = group.RemoteDesktop_OverrideCredSspSupport; RemoteDesktop_EnableCredSspSupport = group.RemoteDesktop_EnableCredSspSupport; RemoteDesktop_OverrideAuthenticationLevel = group.RemoteDesktop_OverrideAuthenticationLevel; @@ -196,6 +198,8 @@ public GroupInfo(GroupInfo group) : this(group.Name) public int RemoteDesktop_ColorDepth { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ColorDepth; public bool RemoteDesktop_OverridePort { get; set; } public int RemoteDesktop_Port { get; set; } = GlobalStaticConfiguration.RemoteDesktop_Port; + public bool RemoteDesktop_OverrideViewOnly { get; set; } + public bool RemoteDesktop_ViewOnly { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ViewOnly; public bool RemoteDesktop_OverrideCredSspSupport { get; set; } public bool RemoteDesktop_EnableCredSspSupport { get; set; } public bool RemoteDesktop_OverrideAuthenticationLevel { get; set; } diff --git a/Source/NETworkManager.Profiles/ProfileInfo.cs b/Source/NETworkManager.Profiles/ProfileInfo.cs index 877d9c472f..3b36201016 100644 --- a/Source/NETworkManager.Profiles/ProfileInfo.cs +++ b/Source/NETworkManager.Profiles/ProfileInfo.cs @@ -100,6 +100,8 @@ public ProfileInfo(ProfileInfo profile) RemoteDesktop_ColorDepth = profile.RemoteDesktop_ColorDepth; RemoteDesktop_OverridePort = profile.RemoteDesktop_OverridePort; RemoteDesktop_Port = profile.RemoteDesktop_Port; + RemoteDesktop_OverrideViewOnly = profile.RemoteDesktop_OverrideViewOnly; + RemoteDesktop_ViewOnly = profile.RemoteDesktop_ViewOnly; RemoteDesktop_OverrideCredSspSupport = profile.RemoteDesktop_OverrideCredSspSupport; RemoteDesktop_EnableCredSspSupport = profile.RemoteDesktop_EnableCredSspSupport; RemoteDesktop_OverrideAuthenticationLevel = profile.RemoteDesktop_OverrideAuthenticationLevel; @@ -345,6 +347,8 @@ public ProfileInfo(ProfileInfo profile) public int RemoteDesktop_ColorDepth { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ColorDepth; public bool RemoteDesktop_OverridePort { get; set; } public int RemoteDesktop_Port { get; set; } = GlobalStaticConfiguration.RemoteDesktop_Port; + public bool RemoteDesktop_OverrideViewOnly { get; set; } + public bool RemoteDesktop_ViewOnly { get; set; } = GlobalStaticConfiguration.RemoteDesktop_ViewOnly; public bool RemoteDesktop_OverrideCredSspSupport { get; set; } public bool RemoteDesktop_EnableCredSspSupport { get; set; } public bool RemoteDesktop_OverrideAuthenticationLevel { get; set; } diff --git a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs index ee66caad44..2d4c40b93f 100644 --- a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs +++ b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs @@ -182,6 +182,7 @@ public static class GlobalStaticConfiguration public static int RemoteDesktop_ColorDepth => 32; public static int RemoteDesktop_Port => 3389; + public static bool RemoteDesktop_ViewOnly => false; public static bool RemoteDesktop_GatewayServerBypassLocalAddresses => true; public static GatewayUserSelectedCredsSource RemoteDesktop_GatewayServerLogonMethod => diff --git a/Source/NETworkManager.Settings/SettingsInfo.cs b/Source/NETworkManager.Settings/SettingsInfo.cs index 1a739e5724..dac5457ea4 100644 --- a/Source/NETworkManager.Settings/SettingsInfo.cs +++ b/Source/NETworkManager.Settings/SettingsInfo.cs @@ -2175,6 +2175,19 @@ public int RemoteDesktop_Port } } = GlobalStaticConfiguration.RemoteDesktop_Port; + public bool RemoteDesktop_ViewOnly + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.RemoteDesktop_ViewOnly; + public bool RemoteDesktop_EnableCredSspSupport { get; diff --git a/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml b/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml index a60f681974..784a51eae7 100644 --- a/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml +++ b/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml @@ -8,6 +8,7 @@ xmlns:dockablz="clr-namespace:Dragablz.Dockablz;assembly=Dragablz" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" xmlns:controls="clr-namespace:NETworkManager.Controls" + xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters" xmlns:application="clr-namespace:NETworkManager.Models;assembly=NETworkManager.Models" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" @@ -18,6 +19,8 @@ d:DataContext="{d:DesignInstance controls:DragablzTabHostWindow}"> + + @@ -53,7 +56,8 @@ + CommandParameter="{Binding View}" + Visibility="{Binding View.IsConnected, Converter={StaticResource BooleanReverseToVisibilityCollapsedConverter}}"> @@ -67,7 +71,8 @@ + CommandParameter="{Binding View}" + Visibility="{Binding View.IsConnected, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}"> @@ -107,6 +112,38 @@ + + + + + + + + + + + + + @@ -160,6 +197,16 @@ + + + + +