La classe avrà tre proprietà di tipo testo, una per la gestione del percorso e nome del file immagine, una per il colore dello sfondo della form e l’latra per la gestione della velocità del cambiamento della posizione dell’immagine.
 
 
Creazione della finestra opzioni
Dopo aver creato la classe che permette la gestione delle opzioni, non ci resta che creare una finestra, nella quale sarà possibile impostare i parametri del nostro salva schermo.
La finestra è composta da una casella combinata per impostare la velocità dello spostamento dell’immagine nello schermo, un controllo di tipo option button per impostare  il colore di sfondo (rosso, verde e blu) una casella di testo ed un pulsante per la selezione dell’immagine, ed un controllo pciturebox, che avrà il compito di visualizzare l’anteprima dell’immagine.
Nella figura 2 è mostrata l’impostazione di tale finestra.
 
.png)
 
Figura2
 
Il pulsante annulla, avrà il compito di chiudere la finestra.
Di seguito si riporta il frammento di codice di tale pulsante 
 
VB.Net
Me.Close()
C#
this.Close();
 
 
 
 
Nell’evento load della form, verranno caricati i dati salvati in precedenza.
Tramite il metodo caricaopzioni, della classe opzioni, verrà valorizzato l’oggetto opzioni, con i dati rilevati dal file di configurazione.
Dopo tale operazione, verranno valorizzati i vari controlli posti sulla form.
Di seguito si riporta il frammento di codice da inserire nell’evento load.
 
VB.Net
'Carico i dati
        Dim fileOpzioni As New Opzioni()
        fileOpzioni.CaricaOpzioni()
        'imposto il colore
        Select Case fileOpzioni.Colore_Sfondo.ToUpper()
            Case "BLU"
                rdbBlu.Checked = True
            Case "VERDE"
                RdbVerde.Checked = True
 
            Case "ROSSO"
                rdbRosso.Checked = True
 
        End Select
        'Imposto la velocità
        cmbVelocita.Text = fileOpzioni.Velocita
        'Percorso foto
        txtNomeFile.Text = fileOpzioni.Immagine
        If fileOpzioni.Immagine.Trim() <> "" Then
            PictureBox1.ImageLocation = fileOpzioni.Immagine
        End If
C#
//Carico i dati
            Opzioni fileOpzioni = new Opzioni();
            fileOpzioni.CaricaOpzioni();
            //imposto il colore
            switch (fileOpzioni.Colore_Sfondo.ToUpper())
            {
                case "BLU":
                    rdbBlu.Checked = true;
                    break;
                case "VERDE":
                    RdbVerde.Checked = true;
                    break;
                case "ROSSO":
                    rdbRosso.Checked = true;
                    break;
            }
            //Imposto la velocità
            cmbVelocita.Text = fileOpzioni.Velocita;
            //Percorso foto
            txtNomeFile.Text = fileOpzioni.Immagine;
            if (fileOpzioni.Immagine.Trim() != "")
                PictureBox1.ImageLocation = fileOpzioni.Immagine;
 
 
  
Il pulsante con il testo dei tre puntini “…” permette di visualizzare una finestra di dialogo per la selezione dell’immagine (jpg o gif).
Impostando la proprietà RestoreDirectory a true permetterà di mantenere le informazioni rilevate, in questo modo, quando andremo a salvare il file di configurazione, le modifiche verranno apportate altrimenti, se impostato a false, nessuna modifica verrà effettuata.
Dopo aver selezionato il file immagine, verrà riportato nella casella di testo il percorso e nome del file immagine, mentre nel controllo picturebox verrà visualizzata l’immagine.
Di seguito si riporta il frammento di codice delle suddette operazioni.
 
 VB.Net
'Carico nella casella di testo il nome ed il percorso del file
         Dim dlgFile As New OpenFileDialog()
        dlgFile.Filter = "*.Jpg|*.Jpg|*.gif|*.gif|*.bmp|*.bmp"
        dlgFile.Title = "Selezionare il file immagine che si vuole impostare come immagine di salvaschermo"
        dlgFile.RestoreDirectory = True
        If dlgFile.ShowDialog() = Windows.Forms.DialogResult.OK Then
            txtNomeFile.Text = dlgFile.FileName
            PictureBox1.ImageLocation = txtNomeFile.Text
        End If
 
C#
//Carico nella casella di testo il nome ed il percorso del file
            OpenFileDialog dlgFile = new OpenFileDialog();
            dlgFile.Filter = "*.Jpg|*.Jpg|*.gif|*.gif|*.bmp|*.bmp";
            dlgFile.Title = "Selezionare il file immagine che si vuole impostare come immagine di salvaschermo";
            dlgFile.RestoreDirectory = true;
            if (dlgFile.ShowDialog() == DialogResult.OK)
            {
                txtNomeFile.Text = dlgFile.FileName;
                PictureBox1.ImageLocation = txtNomeFile.Text;
            }
 
 Per concludere le operazioni su questa form(opzioni), non ci resta che scrivere il codice per il pulsante ok, il quale dovrà salvare le impostazioni per il nostro salva schermo. Tramite il metodo SalvaOpzioni, salveremo i valori impostati nelle varie proprietà (colore_sfondo, velocità ed immagine) nel file di configurazione.
Il codice dev’essere simile a quello riportato qui di seguito.
 
 VB.Net
Dim FileOpzioni As New Opzioni()
        If rdbBlu.Checked = True Then
            FileOpzioni.Colore_Sfondo = "BLU"
        ElseIf RdbVerde.Checked = True Then
            FileOpzioni.Colore_Sfondo = "VERDE"
        Else
            FileOpzioni.Colore_Sfondo = "ROSSO"
        End If
        PictureBox1.ImageLocation = ""
        FileOpzioni.Velocita = cmbVelocita.Text
        FileOpzioni.Immagine = txtNomeFile.Text
        FileOpzioni.SalvaOpzioni()
        Me.Close()
C#
 
Opzioni FileOpzioni = new Opzioni();
            if (rdbBlu.Checked == true)
                FileOpzioni.Colore_Sfondo = "Blu";
            else if (RdbVerde.Checked == true)
                FileOpzioni.Colore_Sfondo = "Verde";
            else
                FileOpzioni.Colore_Sfondo = "Rosso";
            PictureBox1.ImageLocation = "";
            FileOpzioni.Velocita = cmbVelocita.Text;
            FileOpzioni.Immagine = txtNomeFile.Text;
            FileOpzioni.SalvaOpzioni();
            this.Close();
 
 Creazione della finestra Screen Saver
A questo punto non ci resta che scrivere la finestra per il nostro screen saver. La form, del salvaschermo, avrà impostato la proprietà FormBorderStyle in none, mentre la proprietà TopMost sarà impostato a true, e la proprietà WindowState a maximized.
Fatto ciò inseriamo nella form un controllo picturebox, il quale visualizza la nostra immagine, rilevandola nel nostro file di opzioni, ed un controllo per la gestione del tempo, ossia un timer.
Dichiariamo a livello di form le variabili per la gestione della grafica, per il posizionamento del controllo picturebox e per la gestione del mouse.
Di seguito si riporta la dichiarazone di tali campi. 
VB.Net
' oggetto per la grafica
    Private m_Graphics As Graphics
    'Oggetto per le opzioni
    Private m_Opzioni As New Opzioni()
    ' per la prima impostazione
    Private m_Attivo As Boolean = False
    'verifico lo spostamento del mouse
    Private m_MousePosizione As Point
    'oggetto per cambiare di volta in volta le coordinate
    Private m_Random As New Random()
 
 
C#
// oggetto per la grafica
        private Graphics m_Graphics;
        //Oggetto per le opzioni
        private Opzioni m_Opzioni = new Opzioni();
        // per la prima impostazione quando si avvia lo screnn saver
        private bool m_Attivo = false;
        // verifico lo spostamento del mouse
        private Point m_MousePosizione;
        //oggetto per cambiare di volta in volta le coordinate
        private Random m_Random = new Random();
 
 
  
Il nostro programma, sarà avviato tramite un opportuno metodo, questa funzione denominata main, avrà il compito di accettare un argomento, in base al parametro passato, verrà visualizzata o la finestra del salva schermo oppure quelle delle opzioni.
Infatti la finestra delle proprietà dello schermo di Windows, per avviare un salvaschermo, passa degli argomenti, la c sta per opzioni, mentre la s sta per salva schermo, mentre la p, permette l'anteprima del salva schermo.
Di seguito si riporta il frammento di codice di tale operazioni.
 VB.Net
' Programma di avvio - startup del progetto
    <STAThread()> Shared Sub Main(ByVal args As String())
 
        ' Verifico l'argomento che viene passato /c = opzioni /s screnn saver /p da anteprima
        If args.Length > 0 Then
            'Anteprima
            If args(0).ToLower = "/p" Then
                ' da personalizzare anteprima quando viene selezionato dalla finestra screnne saver il nome.
 
 
                
                Application.Exit()
            End If
 
            'finestra delle opzioni
            If args(0).ToLower.Trim().Substring(0, 2) = "/c" Then
                Dim FrmOpzioni As New FrmOpzioni()
                FrmOpzioni.ShowDialog()
 
 
                Application.Exit()
            End If
 
            ' avvio lo screen saver
            If args(0).ToLower = "/s" Then
 
                Dim ScreenForm As New Form1()
                ScreenForm.ShowDialog()
                Application.Exit()
            End If
 
 
        Else
            'in caso di   doppio click
            Dim ScreenForm As New Form1()
            ScreenForm.ShowDialog()
 
 
            Application.Exit()
        End If
    End Sub
C#
   [STAThread]
        static void Main(string[] args)
        {
 
            // Verifico l'argomento che viene passato /c = opzioni /s screnn saver /p da anteprima
            if (args.Length > 0)
            {
                //Anteprima
                if (args[0].ToLower() == "/p")
                {
                    // da personalizzare anteprima quando viene selezionato dalla finestra screnne saver il nome.
 
 
 
                    Application.Exit();
                }
                //finestra delle opzioni
                if (args[0].ToLower().Trim().Substring(0, 2) == "/c")
                {
                    FrmOpzioni FrmOpzioni = new FrmOpzioni();
                    FrmOpzioni.ShowDialog();
 
 
                    Application.Exit();
                }
 
                // avvio lo screen saver
                if (args[0].ToLower() == "/s")
                {
 
                    Form1 ScreenForm = new Form1();
                    ScreenForm.ShowDialog();
                    Application.Exit();
                }
 
            }
            else
            {
                //in caso di   doppio click
                Form1 ScreenForm = new Form1();
                ScreenForm.ShowDialog();
 
                Application.Exit();
            }
 
        }
 
 
Nell’evento load della finestra per visualizzare il screen saver, verrà creato un oggetto di tipo opzioni, che tramite il metodo carica dati, imposta la form con i parametri impostati. Verrà impostato la velocità di spostamento dell’immagine, l’immagine da visualizzare ed il colore dello sfondo della form.
Inoltre verrà avviato il timer.
Di seguito si riporta il codice delle suddette operazoni.
 
VB.Net
'oggetto per la creazione grafica
        Me.m_Graphics = Me.CreateGraphics()
 
        'rilevo le opzioni
        m_Opzioni.CaricaOpzioni()
        PictureBox1.ImageLocation = m_Opzioni.Immagine
 
        'imposto il tempo
        Select Case m_Opzioni.Velocita.ToUpper()
            Case "VELOCE"
                tmrAggiornamento.Interval = 1000
            Case "MEDIA"
                tmrAggiornamento.Interval = 500
            Case "LENTA"
                tmrAggiornamento.Interval = 200
        End Select
        'rilevo il colore di sfondo
        Select Case m_Opzioni.Colore_Sfondo.ToUpper()
            Case "BLU"
                Me.BackColor = Color.Blue
            Case "VERDE"
                Me.BackColor = Color.Green
            Case "ROSSO"
                Me.BackColor = Color.Red
        End Select
 
        'Abilito il timer
        tmrAggiornamento.Enabled = True
C#
  //oggetto per la creazione grafica
            this.m_Graphics = this.CreateGraphics();
 
            //rilevo le opzioni
            m_Opzioni.CaricaOpzioni();
            PictureBox1.ImageLocation = m_Opzioni.Immagine;
 
            //imposto il tempo
            switch (m_Opzioni.Velocita.ToUpper())
            {
                case "VELOCE":
                    tmrAggiornamento.Interval = 1000;
                    break;
                case "MEDIA":
                    tmrAggiornamento.Interval = 500;
                    break;
                case "LENTA":
                    tmrAggiornamento.Interval = 200;
                    break;
            }
            //rilevo il colore di sfondo
            switch (m_Opzioni.Colore_Sfondo.ToUpper())
            {
                case "BLU":
                    this.BackColor = Color.Blue;
                    break;
                case "VERDE":
                    this.BackColor = Color.Green;
                    break;
                case "ROSSO":
                    this.BackColor = Color.Red;
                    break;
            }
            //Abilito il timer
            tmrAggiornamento.Enabled = true;
 
 
 
 
Nell’evento tick del controllo timer verrà richiamata la funzione Visualizzare, che avrà il compito di visualizzare l'immagine, con le impostazioni effettuate.
Di seguito si riporta il codice dell’evento tick del controllo timer.
 
VB.Net
Private Sub tmrAggiornamento_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrAggiornamento.Tick
        Visualizza()
    End Sub
 
C#
private void tmrAggiornamento_Tick(object sender, EventArgs e)
        {
            Visualizza();
        }
 
 
 
Quando si sposta il mouse oppure si digita un suo pulsante, occorre chiudere il nostro applicativo, tramite gli eventi mousemove e mouse down della nostra form, possiamo controllare tale situazione per chiudere il programma.
Di seguito si riporta il frammento di codice per l’evento mousemove
  
VB.Net
Private Sub Form1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
        If Not m_Attivo Then
            Me.m_MousePosizione = New Point(e.X, e.Y)
            m_Attivo = True
        Else
            If Math.Abs(e.X - Me.m_MousePosizione.X) > 10 Or _
               Math.Abs(e.Y - Me.m_MousePosizione.Y) > 10 Then
                'Esco dal programma
                Application.Exit()
            End If
        End If
    End Sub
C#
private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (!m_Attivo)
            {
                this.m_MousePosizione = new Point(e.X, e.Y);
                m_Attivo = true;
            }
            else
            {
                if (Math.Abs(e.X - this.m_MousePosizione.X) > 10 && Math.Abs(e.Y - this.m_MousePosizione.Y) > 10)
                {
                    //Esco dal programma
                    Application.Exit();
                }
            }
        }
 
 
Mentre qui di seguito si riporta il frammento di codice per l’evento MouseDown
VB.Net
Private Sub Form1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
        Application.Exit()
    End Sub
 
C#
private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            Application.Exit();
        }
 
 
 
La funzione visualizza, avrà il compito di impostare le coordinate, o meglio la posizione della picturebox in varie parti dello schermo. Tramite la classe random, impostiamo un numero causale relativo alle coordinate.
Di seguito si riporta lo script per la funzione Visualizza.
VB.Net
Private Sub Visualizza()
        ' Dimensione della form
        Dim maxX As Integer = Me.Width
        Dim maxY As Integer = Me.Height
        ' Coordinate random dinamiche
        Dim x1, x2, y1, y2 As Integer
 
 
        'Genero il numero delle coordinate
        x1 = m_Random.Next(0, maxX)
        x2 = m_Random.Next(0, maxX)
 
        y1 = m_Random.Next(0, maxY)
        y2 = m_Random.Next(0, maxY)
 
        
 
        'imposto le coordinate
        If y1 < 500 Then y1 = 400
        PictureBox1.Top = y1 - PictureBox1.Height
        If x1 < 400 Then x1 = 400
        PictureBox1.Left = x1 - PictureBox1.Width
         
    End Sub
C#
private void Visualizza()
        {
            //Dimensione della form
            Int32 maxX = this.Width;
            Int32 maxY = this.Height;
            // Coordinate random dinamiche
            Int32 x1, x2, y1, y2;
 
 
            //Genero il numero delle coordinate
            x1 = m_Random.Next(0, maxX);
            x2 = m_Random.Next(0, maxX);
 
            y1 = m_Random.Next(0, maxY);
            y2 = m_Random.Next(0, maxY);
 
 
 
            //imposto le coordinate
            if (y1 < 500)
                y1 = 400;
            PictureBox1.Top = y1 - PictureBox1.Height;
            if (x1 < 400)
                x1 = 400;
            PictureBox1.Left = x1 - PictureBox1.Width;
 
        }
 
 
 
Impostazioni e test del nostro salva schermo.
A questo punto non ci resta che testare il nostro salva schermo, compiliamo in modalità realese, se volete fare il debug, lasciate modalità debug.
Nelle proprietà del progetto, impostate il progetto di avvio, con il metodo main. Inoltre per il linguaggio VB.Net, impostate per la scheda “compile” compilazione, La voce implicit conversion e late binding call could fail at run time a none.
Mentre nella finestra assembly information (tramite il pulsante con la scritta "Assembly Information") spuntate il checkbox quello relativo a make assembly com-visible.
Dopo aver compilato il progetto, rinominate il file exe in .scr e copiatelo nella cartella C:\WINDOWS\system32 (qualora il sistema operativo è installato in tale unità).
Aprire la finestra delle proprietà dello schermo, nel tab Screen Saver, selezionate dall’elenco dei salva schermo, il vostro salva schermo appena creato, digitate il pulsante prova, per verificare le corrette impostazioni.
 
Conclusioni:
In questo articolo si è visto come creare un semplice salva schermo, che visualizza un immagine in diverse posizione dello schermo.  Questo articolo ha fornito al lettore le basi per la creazione di un salva schermo, naturalmente si può ampliare, migliorare con effetti avanzati.
Tramite la parola download è possibile scaricare il file di esempio utilizzato in questo articolo.
 
Download