martedì 14 ottobre 2008

Catturare le schermate del dispositivo mobile tramite il CF NET 2.0

Per il sito i programmatori http://www.iprogrammatori.it/articoli/programmazione/art_catturare-le-schermate-del-dispositivo-m_134.aspx ho scritto un articolo, per lo sviluppo di applicazioni mobile. In particolare come catture le schermate del dispositivo mobile, tramite il linguaggio di programmazione VB.Net e C#.


Di seguito riporto l'articolo, a fine articolo è possibile scaricare il file d'esempio.


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


<DllImport("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


<DllImport("coredll.dll")> _


Public Shared Function GetDC(ByVal hWnd As System.IntPtr) As System.IntPtr


End Function


<DllImport("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 /*SRCCOPY*/);


//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 /*SRCCOPY*/);


//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





Nessun commento: