Catturare le schermate del dispositivo mobile tramite il CF NET 2.0

In questo articolo vedremo come in ambiente windows mobile possiamo salvare in un file immagine la schermata del proprio dispositivo mobile.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

Qualora si ha la necessita di salvare in un file immagine la schermata del proprio dispositivo, qui di seguito sono riportati due esempi di codice, che permettono di catturare la schermata del proprio dispositivo mobile, con e senza la taskbar di Windows Mobile 5.0.

In questo articolo sono illustrati i passi, per creare un applicazioni per dispositivo mobile, tramite l’uso delle api e con il compact frame work versione 2.0 tramite il linguaggio di programmazione Visual Basic net e C#.

L’immagine salvata è in formato jpg.

Ma vediamo in dettaglio l’articolo.

Si crea un nuovo progetto smart device di tipo device application, a questo punto nella form inseriamo due pulsanti,  uno ci permetterà di catturare la schermata con la taskbar, mentre l’altro permette di salvare in un file immagine jpg solo la form attiva.

La finestra dev’è essere simile a quella illustrata qui di seguito.

 

 

Figura 1

Stesura del codice.

Ora terminata la creazione della nostra device form, passiamo alla visualizzazione del codice, per scrivere le istruzioni per la cattura dello schermo.  Dobbiamo includere lo spazio dei nomi System.Runtime.Interop.Services il quale ci permette di utilizzare le api di Windows Mobile.

Di seguito si riporta tale dichiarazione.

 

 

VB.Net
Imports System.Runtime.InteropServices
C#
using System.Runtime.InteropServices;

 

 

Tramite le funzioni api bitblt, getdc e ReleaseDC della dll coredll.dll ci permetterà di catturare ciò che è visualizzato a video o nella form.

Di seguito si riporta il frammento di codice della dichiarazione di api, da inserire a livello di form.

 

VB.Net
   'dichiarazione di api
    "coredll.dll")> _
    Private Shared Function BitBlt(ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, _
    ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As Integer) As Boolean
    End Function
    "coredll.dll")> _
    Public Shared Function GetDC(ByVal hWnd As System.IntPtr) As System.IntPtr
    End Function
    "coredll.dll")> _
    Public Shared Function ReleaseDC(ByVal hWnd As System.IntPtr, ByVal hDC As System.IntPtr) As Integer
    End Function
C#
  //dichiarazione di api
        [DllImport("coredll.dll")]
        private static extern bool BitBlt(
          IntPtr hdcDest,       
          int nXDest,           
          int nYDest,           
          int nWidth,           
          int nHeight,          
          IntPtr hdcSrc,        
          int nXSrc,            
          int nYSrc,            
          System.Int32 dwRop    
          );
        [DllImport("coredll.dll")]
        public extern static System.IntPtr GetDC(System.IntPtr hWnd);
        [DllImport("coredll.dll")]
        public extern static int ReleaseDC(System.IntPtr hWnd, System.IntPtr hDC); 

A questo punto occorre creare due funzioni, una ci permetterà di salvare in un file immagine di tipo jpg, tutto ciò che è riporto a video, mentre l’altra solo ciò che è presente nella form attiva in quel momento.

Ma vediamo in dettaglio le varie funzioni.

Qui di seguito si riporta la funzione per il salvataggio di ciò che è visibile a video, escludendo la taskbar.

 

VB.Net
'cattura e salva l'immagine della sola form
    Private Sub CatturaForm()
        'ottengo handler della form creo un oggetto di tipo bmp per gestire l'immagine
        Dim srcDC As System.IntPtr = GetDC(Me.Handle)
        Dim bm As New System.Drawing.Bitmap(Me.Width, Me.Height)
        Dim graphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bm)
        Dim bmDC As System.IntPtr = graphics.GetHdc()
        'copio la form nella bitmap
        BitBlt(bmDC, 0, 0, bm.Width, bm.Height, srcDC, _
        0, 0, 13369376)
        'Rilascio le risorse
        ReleaseDC(Me.Handle, srcDC)
        graphics.ReleaseHdc(bmDC)
        graphics.Dispose()
        ' Salvo l'immagine in formato jpeg
        Dim filename As String = "immagine.jpg"
        bm.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg)
        MessageBox.Show("Immagine salvata: " + filename)
    End Sub
C#
//cattura e salva l'immagine della sola form
        private void CatturaForm()
        {
            //ottengo handler della form creo un oggetto di tipo bmp per gestire l'immagine
            System.IntPtr srcDC = GetDC(this.Handle);
            System.Drawing.Bitmap bm = new System.Drawing.Bitmap(this.Width, this.Height);
            System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bm);
            System.IntPtr bmDC = graphics.GetHdc();
            //copio la form nella bitmap
            BitBlt(bmDC, 0, 0, bm.Width, bm.Height, srcDC, 0, 0, 0x00CC0020);
            //Rilascio le risorse
            ReleaseDC(this.Handle, srcDC);
            graphics.ReleaseHdc(bmDC);
            graphics.Dispose();
            // Salvo l'immagine in formato jpeg
            string filename = "immagine.jpg";
            bm.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);
            MessageBox.Show("Immagine salvata: " + filename);
        }

 

 La funzione riportata qui di seguito a differenza della precedente, salva in un file immagine jpg, tutto ciò che è visibile a video, compresa anche la taskbar.

 

 

VB.Net
'cattura e salva l'immagine di tutta la finestra, compersa la taskbar
    Private Sub CatturaFormConTaskBar()
        'ottengo handler della form creo un oggetto di tipo bmp per gestire l'immagine
        Dim srcDC As System.IntPtr = GetDC(IntPtr.Zero)
        Dim bm As New System.Drawing.Bitmap(Me.Width, Me.Height)
        Dim graphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bm)
        Dim bmDC As System.IntPtr = graphics.GetHdc()
        'copio la form nella bitmap
        BitBlt(bmDC, 0, 0, bm.Width, bm.Height, srcDC, _
        0, 0, 13369376)
        'Rilascio le risorse
        ReleaseDC(IntPtr.Zero, srcDC)
        graphics.ReleaseHdc(bmDC)
        graphics.Dispose()
        ' Salvo l'immagine in formato jpeg
        Dim filename As String = "immagine.jpg"
        ' String.Format("Snap{0}.jpg", index++);
        bm.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg)
        MessageBox.Show("Immagine salvata: " + filename)
    End Sub
C#
//cattura e salva l'immagine di tutta la finestra, compersa la taskbar
        private void CatturaFormConTaskBar()
        {
          //ottengo handler della form creo un oggetto di tipo bmp per gestire l'immagine
            System.IntPtr srcDC = GetDC(IntPtr.Zero);
            System.Drawing.Bitmap bm = new System.Drawing.Bitmap(this.Width, this.Height);
            System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bm);
            System.IntPtr bmDC = graphics.GetHdc();
            //copio la form nella bitmap
            BitBlt(bmDC, 0, 0, bm.Width, bm.Height, srcDC, 0, 0, 0x00CC0020);
            //Rilascio le risorse
            ReleaseDC(IntPtr.Zero, srcDC);
            graphics.ReleaseHdc(bmDC);
            graphics.Dispose();
            // Salvo l'immagine in formato jpeg
            string filename = "immagine.jpg";
            bm.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);
            MessageBox.Show("Immagine salvata: " + filename);
        }

 

 

Queste funzioni vengono richiamate nell’evento click di un pulsante, di seguito sono richiamate le istruzioni per il pulsante per il salvataggio della schermata senza taskbar, mentre la seconda parte per il richiamo della funzione per il salvataggio della schermata con la Taskbar.

 

VB.Net
Private Sub btnCattura_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCattura.Click
        CatturaForm()
    End Sub
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
        CatturaFormConTaskBar()
    End Sub
C#
private void btnCattura_Click(object sender, EventArgs e)
        {
            CatturaForm();
        }
private void button1_Click(object sender, EventArgs e)
        {
            CatturaFormConTaskBar();
        }

 

Conclusioni.

L’articolo ha illustrato una tecnica sull’utilizzo delle api, in particolare per la “cattura” di ciò che è visualizzato a video.  In allegato a questo articolo si può scaricare il file di esempio utilizzato, tramite la parola Download.

Download