Blocco screenshot su MAUI.net

Blocco screenshot su MAUI.net

In questo articolo tecnico rivolto a sviluppatori .NET e mobile alle prime armi, esploriamo le strategie per bloccare gli screenshot in applicazioni .NET MAUI su Android, iOS, Windows e Web, con esempi di codice e riferimenti a librerie disponibili sul mercato.

Blocco screenshot su MAUI.net

In .NET MAUI è possibile bloccare le catture dello schermo in diversi modi:

  • Android sfruttando il flag nativo WindowManagerFlags.Secure o Display.FlagSecure per impedire screenshot e registrazioni .
  • iOS utilizzando un overlay sfocato (es. UIVisualEffectView) nel ciclo di vita dell’app o affidandosi alle policy di dispositivo in contesti gestiti .
  • Windows Desktop tramite P/Invoke di SetWindowDisplayAffinity, che limita cosa può essere catturato dal sistema operativo .
  • Web non esistono API browser-native per bloccare screenshot: si possono solo adottare workaround come overlay CSS/JS, ma non è mai completamente efficace.
  • Plugin MAUI: Plugin.Maui.ScreenSecurity semplifica l’abilitazione/disabilitazione dinamica del blocco e l’ascolto di eventi di screenshot su Android, iOS e Windows.

Perché attivare il Blocco screenshot su MAUI.net

Le app che gestiscono dati sensibili (es. banking, documenti riservati, contenuti DRM) devono prevenire la cattura non autorizzata dello schermo. Senza questa protezione, un utente può violare la privacy o i diritti d’autore semplicemente scattando una foto digitale o usando strumenti di registrazione schermo.

Soluzioni native per Android

Su Android il metodo più semplice è impostare il flag FLAG_SECURE sulla finestra dell’Activity.

using Android.Views;
using Microsoft.Maui;
using Platform = Microsoft.Maui.ApplicationModel.Platform;

public static void EnableSecureFlag()
{
    var activity = Platform.CurrentActivity;
    activity?.Window?.SetFlags(
        WindowManagerFlags.Secure,
        WindowManagerFlags.Secure
    );
}

Questo previene sia gli screenshot sia la proiezione del contenuto su display non sicuri . Tuttavia, da .NET MAUI 9 su pagine modali il flag può non essere applicato correttamente, richiedendo workaround o plugin dedicati .

Soluzioni native per iOS

Apple non fornisce un’impostazione FLAG_SECURE come Android, ma si può oscurare il contenuto quando l’app va in background:

// AppDelegate.swift
import UIKit
import Flutter

@UIApplicationMain
class AppDelegate: FlutterAppDelegate {
  var blurView: UIVisualEffectView?

  override func applicationWillResignActive(_ application: UIApplication) {
    let blurEffect = UIBlurEffect(style: .regular)
    blurView = UIVisualEffectView(effect: blurEffect)
    blurView?.frame = window!.bounds
    window?.addSubview(blurView!)
  }

  override func applicationDidBecomeActive(_ application: UIApplication) {
    blurView?.removeFromSuperview()
  }
}

In contesti gestiti (MDM) è possibile utilizzare la policy “Block screenshots and screen recording” su dispositivi iOS, ma è un’impostazione che agisce a livello di device e non di singola app .

Soluzioni per Windows Desktop

Su Windows desktop (WPF/UWP/WinUI) è possibile utilizzare la chiamata nativa SetWindowDisplayAffinity per indicare al sistema di non consentire la cattura del contenuto della finestra:

using System;
using System.Runtime.InteropServices;
using Microsoft.UI.Xaml;
using WinRT;

// P/Invoke
[DllImport("user32.dll")]
static extern bool SetWindowDisplayAffinity(IntPtr hwnd, uint affinity);

const uint WDA_MONITOR = 1;

public void ProtectWindow(Window window)
{
    var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(window);
    SetWindowDisplayAffinity(hwnd, WDA_MONITOR);
}

Tuttavia, la chiamata può restituire ERROR_INVALID_PARAMETER se non supportata dall’OS o dal contesto di esecuzione

Soluzioni per il Web

Nei browser non esistono API standard per bloccare screenshot o screen recording. Alcuni workaround includono disabilitare il tasto destro, posizionare overlay semi-trasparenti o monitorare eventi di tastiera, ma nessuno impedisce realmente la cattura schermo, che resta sotto il controllo del sistema operativo.

Librerie e plugin per Blocco screenshot su MAUI.net

Plugin.Maui.ScreenSecurity

Un plugin cross-platform che racchiude in un’unica API la gestione del blocco screenshot su Android, iOS e Windows.

Installazione

Install-Package Plugin.Maui.ScreenSecurity

Inicializzazione (in MauiProgram.cs)

using Plugin.Maui.ScreenSecurity;

public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();
    builder
      .UseMauiApp<App>()
      .UseScreenSecurity(); // registra il servizio
    return builder.Build();
}

Utilizzo

using Plugin.Maui.ScreenSecurity;

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        // Disabilita screenshot
        ScreenSecurity.Default.Enable();
        // Riabilita screenshot
        // ScreenSecurity.Default.Disable();

        // Ascolta eventi di cattura
        ScreenSecurity.Default.ScreenCaptured += (s, e) =>
        {
            Debug.WriteLine("Screenshot preso!");
        };
    }
}

Di seguito un elenco dei principali plugin (e soluzioni correlate) per bloccare screenshot nelle app .NET MAUI, con esempi di codice e una tabella riassuntiva di pro e contro.

1. Plugin.Maui.ScreenSecurity

Il plugin open-source più diffuso per .NET MAUI, sviluppato da Fabri Bertani, espone un’unica API cross-platform per Android, iOS e Windows, permettendo di attivare/disattivare la protezione e di intercettare gli eventi di screenshot .

Installazione

Install-Package Plugin.Maui.ScreenSecurity

Registrazione (MauiProgram.cs)

using Plugin.Maui.ScreenSecurity;

public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();
    builder
      .UseMauiApp<App>()
      .UseScreenSecurity();    // abilita il servizio
    return builder.Build();
}

Utilizzo (ad es. in MainPage.xaml.cs)

using Plugin.Maui.ScreenSecurity;

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

        // Disabilita screenshot/registrazione
        ScreenSecurity.Default.Enable();

        // Riabilita screenshot
        // ScreenSecurity.Default.Disable();

        // Event handler per screenshot
        ScreenSecurity.Default.ScreenCaptured += (s, e) =>
        {
            Debug.WriteLine("È stato scattato uno screenshot!");
        };
    }
}

2. ScreenShieldKit (commerciale)

E’ un SDK a pagamento che fornisce widget (iOS) e librerie native per Flutter, Xamarin, React Native, SwiftUI, ma non “pronto MAUI” . Di solito si integra via NuGet/CocoaPods e offre protezione avanzata (watermark, blur dinamico, hot-zone non capturabili).

Esempio di pseudo-codice MAUI (ipotetico, serve wrapper nativo)

// Dopo aver aggiunto il binding di ScreenShieldKit:
public partial class SecurePage : ContentPage
{
    protected override void OnAppearing()
    {
        base.OnAppearing();
        // Attiva protezione su iOS/macOS
        ScreenShieldKit.Protect(this.Handler.PlatformView);
    }

    protected override void OnDisappearing()
    {
        // Disattiva protezione
        ScreenShieldKit.Unprotect(this.Handler.PlatformView);
        base.OnDisappearing();
    }
}

3. Appdome (piattaforma di integrazione)

Non è un “plugin” MAUI ma un servizio SaaS che, in fase di build, inietta protezioni anti-screenshot e anti-screenrecording nelle app Android/iOS, sia in contesti BYOD sia gestiti (MDM/MAM) .

# Flusso tipico (no-code):
1. Carica APK/AAB o IPA su Appdome.
2. Seleziona “Prevent Screenshot” e “Prevent Screen Recording”.
3. Scarica l’app “protetta” e distribuiscila.

4. Soluzione manuale (senza plugin)

Se non si vuole dipendere da librerie esterne, si possono usare direttamente le API native:

Android

using Android.Views;
using Microsoft.Maui.ApplicationModel;

public static void EnableAndroidSecureFlag()
{
    var activity = Platform.CurrentActivity;
    activity.Window.SetFlags(
        WindowManagerFlags.Secure,
        WindowManagerFlags.Secure
    );
}

iOS

Inserire in AppDelegate (Xamarin.Forms/MAUI):

override func applicationWillResignActive(_ application: UIApplication) {
    let blur = UIBlurEffect(style: .regular)
    let blurView = UIVisualEffectView(effect: blur)
    blurView.frame = window!.bounds
    window?.addSubview(blurView)
}
override func applicationDidBecomeActive(_ application: UIApplication) {
    window?.subviews
          .filter { $0 is UIVisualEffectView }
          .forEach { $0.removeFromSuperview() }
}

Tabella riassuntiva principali plugin Blocco screenshot su MAUI.net

SoluzionePiattaformeProContro
Plugin.Maui.ScreenSecurityAndroid, iOS, Windows• Open-source e gratuito• API unificata• Event stream di screenshot• Nessun supporto Web/MacCatalyst
ScreenShieldKitiOS (Xamarin, Flutter…)• Protezione avanzata• Widget nativi con watermark/blur• Commerciale a pagamento• Non pronto MAUI
AppdomeAndroid, iOS• No-code, velocissimo da integrare• Supporto MDM/MAM• Servizio SaaS a consumo• Non modifica il codice
Implementazione manualeAndroid, iOS• Nessuna dipendenza esterna• Pieno controllo• Code-duplication per piattaforma• Maggiore complessità

Nota: al momento non esistono altri plugin specifici per .NET MAUI dedicati al blocco screenshot oltre a quelli elencati. Per Web e desktop macOS non esistono API native che permettano un blocco reale dello screenshot, si ricorre a soluzioni di overlay o a servizi esterni.

Conclusioni – Blocco screenshot su MAUI.net

Bloccare gli screenshot in .NET MAUI richiede approcci diversi a seconda della piattaforma. Se da un lato è possibile intervenire direttamente con flag nativi su Android e overlay sfocati su iOS, dall’altro per Windows serve P/Invoke a SetWindowDisplayAffinity, mentre sul Web non esistono protezioni reali. L’utilizzo di plugin come Plugin.Maui.ScreenSecurity semplifica l’implementazione e garantisce coerenza tra le piattaforme supportate.

(fonte) (fonte) (fonte)

Innovaformazione, scuola informatica specialistica promuove lo sviluppo mobile con MAUI.net in maniera consapevole. Accompagniamo le aziende nella formazione del team di sviluppatori e nell’offerta formativa trovate il Corso MAUI.net .

Per altri articoli tecnici invece consigliamo di navigare sul nostro blog QUI.

INFO: info@innovaformazione.net – tel. 3471012275 (Dario Carrassi)

Vuoi essere ricontattato? Lasciaci il tuo numero telefonico e la tua email, ti richiameremo nelle 24h:

    Ti potrebbe interessare

    Articoli correlati