VB .NET - Protegendo suas imagens do Print Screen


 Neste artigo vou mostrar uma forma de evitar que imagens de sua aplicação sejam copiadas com Print Screen em aplicações VB .NET.

Se você precisar proteger suas imagens em um programa VB .NET do Print Screen pode usar o recurso que será mostrado neste artigo.

Ele não é infalível e um usuário com conhecimentos mais avançado poderá desabilitar o recurso mas é uma opção visto que pode proteger suas imagens da maioria das pessoas. (É claro que basta tirar uma foto da imagem que a proteção não funcionará).

O código de proteção utiliza o namespace System.Runtime.InteropServices e a função SetWindowDisplayAffinity que armazena a configuração de afinidade do display no Kernel no hWnd associado com a janela.

Esta função e a função GetWindowDisplayAffinity foram projetadas para suportar o recurso de proteção de conteúdo da janela do Windows 7, e permite que os aplicativos protejam os seus conteúdos de janela na tela de ser capturado ou copiado através de um conjunto específico de recursos do sistema operacional.

No entanto, ele só funciona quando o Desktop Window Manager (DWM) está compondo o ambiente de trabalho.

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS Community 2015 e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application

Informe o nome Disable_PrintScreen e clique no botão OK;

No formulário form1.vb inclua um controle PictureBox - picImagem e defina uma imagem qualquer que iremos usar para testar a proteção.

Inclua também um controle CheckBox - chkProtege - com o texto - Ativar Proteção.

Disponha os controles conforme a figura a seguir:

Criando a classe para proteger contra o Print Screen

No menu Project clique em Add Class e informe o nome Protecao.vb.

A seguir inclua o código a seguir nesta classe :

Imports System.Runtime.InteropServices
Public Class Protecao
    Private Const WDA_NONE As UInteger = &H0
    Private Const WDA_MONITOR As UInteger = &H1

    <DllImport("user32.dll")>
    Private Shared Function SetWindowDisplayAffinity(ByVal hWnd As IntPtr, ByVal dwAffinity As UInteger) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

    Public Shared Function ProtecaoContraPrintScreen(ByVal winForm As Form, ByVal Protege As Boolean) As Boolean
        Dim resultado As Boolean = False
        If winForm IsNot Nothing Then
            If Protege Then
                resultado = SetWindowDisplayAffinity(winForm.Handle, WDA_MONITOR)
            Else
                resultado = SetWindowDisplayAffinity(winForm.Handle, WDA_NONE)
            End If
        End If
        Return result
    End Function
End Class

Vamos entender o código:

Usamos o atributo DllImport() para importar as funções que vamos usar da API "user32.dll".

A seguir usamos a função SetWindowDisplayAffinity() para proteger um formulário contra a ação do Print Screen.

O método ProtecaoContraPrintScreen() usa a função e recebe define dois parâmetros:

  1. winForm - indica o formulário a ser protegida
  2. protege - ativa ou desativa a proteção (True/False)

Se o valor de protege for True então o valor WDA_MONITOR é usado o que indica para exibir o conteúdo do formulário somente no monitor.

Se o valor for False o valor WDA_NONE é usado o que indica para remover a afinidade com o monitor.

Para concluir defina o código a seguir no evento ChechedChanged do checkbox:

 Private Sub chkProtege_CheckedChanged(sender As Object, e As EventArgs) Handles chkProtege.CheckedChanged
        If Not Protecao.ProtecaoContraPrintScreen(Me, chkProtege.Checked) Then
            Me.Text = "Proteção Falhou..."
        End If
End Sub

O código apenas habilita a proteção quando o checkbox for marcado passando a instância do formulário a ser protegido(Me) e o valor True.

Agora é só alegria...

Executando o projeto e selecionando o checkbox iremos proteger a imagem de um Print Screen conforme mostrado a seguir:

Pegue o projeto completo aqui :   Disable_PrintScreen.zip

"Portanto nós também, pois que estamos rodeados de uma tão grande nuvem de testemunhas, deixemos todo o embaraço, e o pecado que tão de perto nos rodeia, e corramos com paciência a carreira que nos está proposta,"
Hebreus 12:1

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti