diff --git a/.gitignore b/.gitignore
index 93d822baf..6eb7e35bd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -297,3 +297,40 @@ Server.Installer/Properties/launchSettings.json
!/.vscode/tasks.json
/Server/appsettings.Development.json
/Server/AppData
+# build/IDE
+bin/
+obj/
+.vs/
+*.user
+*.suo
+
+# artifacts
+*.zip
+*.7z
+*.tar
+*.tgz
+
+# system
+Thumbs.db
+bin/
+obj/
+.vs/
+*.user
+*.suo
+*.zip
+*.7z
+*.tgz
+Thumbs.db
+# .NET
+bin/
+obj/
+.vs/
+
+# Rider/other IDEs
+.idea/
+
+# Publish & local artifacts (don’t commit compiled builds)
+publish-linux/
+artifacts/
+Server/wwwroot/Downloads/
+AppData/
diff --git a/Desktop.Shared/Enums/ButtonAction.cs b/Desktop.Shared/Enums/ButtonAction.cs
index 8a3df55da..1b283fa06 100644
--- a/Desktop.Shared/Enums/ButtonAction.cs
+++ b/Desktop.Shared/Enums/ButtonAction.cs
@@ -3,5 +3,7 @@
public enum ButtonAction
{
Down,
- Up
+ Up,
+ PrivacyOn,
+ PrivacyOff
}
diff --git a/Desktop.Shared/Messages/ButtonActionMessage.cs b/Desktop.Shared/Messages/ButtonActionMessage.cs
new file mode 100644
index 000000000..c805a2eab
--- /dev/null
+++ b/Desktop.Shared/Messages/ButtonActionMessage.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Remotely.Desktop.Shared.Messages;
+
+using Remotely.Desktop.Shared.Enums;
+
+public sealed class ButtonActionMessage
+{
+ public ButtonAction Action { get; set; }
+}
diff --git a/Desktop.Win/Desktop.Win.csproj b/Desktop.Win/Desktop.Win.csproj
index 165307d11..0b9503ff1 100644
--- a/Desktop.Win/Desktop.Win.csproj
+++ b/Desktop.Win/Desktop.Win.csproj
@@ -15,6 +15,8 @@
True
enable
+ true
+ true
diff --git a/Desktop.Win/PrivacyOverlay.cs b/Desktop.Win/PrivacyOverlay.cs
new file mode 100644
index 000000000..155fe8262
--- /dev/null
+++ b/Desktop.Win/PrivacyOverlay.cs
@@ -0,0 +1,100 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+
+namespace Remotely.Desktop.Win;
+
+///
+/// Fullscreen black overlay per monitor that is excluded from screen capture
+/// (local user sees black) but is click-through and non-activating so remote
+/// input still reaches underlying windows.
+///
+internal static class PrivacyOverlay
+{
+ private static readonly List