Proteggiamoci da occhi indiscreti
a cura di Michele Neri (requisiti: conoscenza generica di Visual Basic)

L'evolversi di Visual Basic, dalla versione 3 ad oggi, con l'imminente uscita della 7, ci permette di avere degli strumenti standard che teoricamente ci consentirebbero di realizzare qualsiasi cosa. Tuttavia a volte è necessario utilizzare funzionalità tipiche di un linguaggio che operi a livello di sistema: es. C++. Per ovviare a queste differenze Microsoft ha messo a disposizione dei programmatori Visual Basic le API. Le API (Application Program Interface) sono un insieme di funzioni, messaggi, strutture, tipi e istruzioni utilmente accessibili da VB qualora sia necessario l'impiego di funzionalità tipiche di un linguaggio a basso livello come il C++.

Questa brevissima premessa mi è sembrata opportuna poiché nell'esempio di programmazione di quest'articolo, sfrutteremo le Api. Realizzeremo un programma che protegga il lavoro presente nel nostro computer da occhi indiscreti, permettendoci di bloccare il mouse all'interno di un form, nascondere le icone del desktop, la barra delle applicazioni e bloccare la tastiera.

Procediamo per passi: prima di tutto disegniamo un form di piccole dimensioni (Width=5820 Top = 3825) assegnandogli la proprietà BorderStyle = None. Posizioniamo due caselle di testo e le chiamiamo ProtTxt e LibTxt (impostando la proprietà PasswordChar = *) e infine inseriamo tre pulsanti (CmdProt- CmdLib - Esci).
A questo punto incominciamo a scrivere del codice. Dichiariamo la prima variabile

Option Explicit

Dim password As String

Nella routine che gestisce l'evento Load del form scriviamo il codice che lasci visibile la casella di testo per inserire la password di blocco e nasconda quella di sblocco, inoltre rendiamo attivo di default il pulsante CmdProt .

Private Sub Form_Load()

	LibTxt.Visible = False
	ProtTxt.Visible = True
	CmdProt.Default = True

End sub

Successivamente associamo al pulsante CmdProt il seguente codice che ci permetterà, previo l'inserimento di una password, di bloccare il mouse, disabilitare la tastiera e nascondere la barra delle applicazioni e le icone del desktop.
Nel codice sono riportate tutte le combinazioni ma voi potete utilizzare quelle che più ritenete opportune.

Private Sub CmdProt_Click()

    If Len(ProtTxt.Text) >= 1 Then

        password = ProtTxt.Text

    Else

        Msgbox "Inserisci una password"
        Exit Sub

    End If

    ' disabilita il pulsante di bloccaggio

 	CmdProt.Enabled = False

	' richiama il modulo per bloccare mouse e tastiera

	LockCursor (True)
	DisableCtrlAltCanc (True)

	' eventualmente nasconde anche le icone del desktop e la barra delle applicazioni

	HideDesktop (True)
	HideStartBar (True)

	CmdLib.Default = True

	ProtTxt.Visible = False
	LibTxt.Visible = True

	' dà il focus solo sulla casella di testo per inserire la password di sblocco

	LibTxt.SetFocus

End Sub

A questo punto inseriamo il codice relativo al pulsante CmdLib che ci permetterà di liberare il mouse

Private Sub CmdLib_Click()

    If LibTxt= password Then

        LockCursor (False)
        DisableCtrlAltCanc (False)
        HideDesktop (False)
        HideStartBar (False)

    ElseIf Len(LibTxt) = 0 Then

        msgbox "Inserisci la password"
        LockCursor (True)

    Else

        msgbox "Password errata !"
        LibTxt.Text = ""

    End If

End Sub

Qui di seguito è riportato il codice dei moduli con i relativi richiami alle API. Basta inserire tramite l'apposito menu di VB un modulo bas e il gioco è fatto.
Cominciamo con il codice per disabilitare la tastiera che chiameremo ModDisableCtrlAltCanc.bas

Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" _
	(ByVal uAction As Long, ByVal uParam As Long, _
	ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long

Sub DisableCtrlAltCanc(Disabled As Boolean)

	SystemParametersInfo 97, Disabled, CStr(1), 0

End Sub

Questo è il codice per nascondere le icone del desktop e la barra delle applicazioni (ModHideDesktop.bas)

Sub HideDesktop(ByVal Hidden As Boolean)

	Dim hwnd_Desktop As Long

	hwnd_Desktop = GetWindow(FindWindow("Progman", "Program manager"), GW_CHILD)

    If Hidden Then

        ShowWindow hwnd_Desktop, SW_HIDE

    Else

        ShowWindow hwnd_Desktop, SW_SHOW

    End If

End Sub

' nasconde la barra delle applicazioni
Sub HideStartBar(ByVal Hidden As Boolean)

	Dim hwnd_StartBar As Long
	hwnd_StartBar = FindWindow("Shell_TrayWnd", "")

    If Hidden Then

        ShowWindow hwnd_StartBar, SW_HIDE

    Else

        ShowWindow hwnd_StartBar, SW_SHOW

    End If

End Sub

Questo è il modulo per bloccare il mouse, (ModLockCursor.bas). La struttura RECT è indispensabile perché usata dall' Api GetWindowsRect e serve per far riconoscere al programma le dimensioni dello schermo.

Type RECT
	Left As Long
	Top As Long
	Right As Long
	Bottom As Long
End Type

Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long
Declare Function GetDesktopWindow Lib "user32" () As Long

Sub LockCursor(ByVal Locked As Boolean)

	Dim myform As RECT  'Dimensioni form
	Dim desktop As RECT 'Dimensioni desktop

    If Locked Then

        GetWindowRect FrmMike.hwnd, myform
        ClipCursor myform

    Else

        GetWindowRect GetDesktopWindow, desktop
        ClipCursor desktop

    End If

End Sub

A questo punto si può creare l'eseguibile. Suggerirei tuttavia di rendere il programma attivo all'avvio di Windows, offrendo la possibilità all'utente di memorizzare la password e personalizzare il form, ma questo lo vedremo in un prossimo articolo.

(L'autore, Michele Neri, è disponibile per chiarimenti all'indirizzo micner@tiscalinet.it)