El código del formulario fPicPreview
'------------------------------------------------------------------------------
' Para ver las capturas realizadas (28/Dic/07)
'
' ©Guillermo 'guille' Som, 2007
'------------------------------------------------------------------------------
Option Strict On
Imports Microsoft.VisualBasic
Imports System
Imports System.Windows.Forms
Imports System.Drawing.Imaging
Imports System.IO
Public Class fPicPreview
Public Guardado As Boolean
Public FileName As String = "SinTitulo.png"
Private Const guardadoComo As String = "Guardado como "
' Para guardar automáticamente desde el form que lo llama
Public Sub Guardar()
Guardar(FileName, ImageFormat.Png)
End Sub
Private Sub guardar(ByVal nombre As String, ByVal formato As ImageFormat)
Dim ext As String = System.IO.Path.GetExtension(nombre)
' Si no tiene path, guardarlo en My Pictures (31/Dic/07)
If System.IO.Path.GetFileName(nombre).CompareTo(nombre) = 0 Then
Dim sDir As String = My.Computer.FileSystem.SpecialDirectories.MyPictures
If sDir.EndsWith("\") = False Then
sDir &= "\"
End If
nombre = sDir & nombre
' Si existe, cambiar el nombre
If File.Exists(nombre) Then
nombre = sDir & Path.GetFileNameWithoutExtension(nombre) & _
" " & DateTime.Now.ToString("yyyyMMdd_HHmmss") & ext
End If
End If
picClipB.Image.Save(nombre, formato)
labelInfo.Text = "Imagen guardada como " & ext.ToUpper
' Mostrar el nombre (31/Dic/07)
' Esto servirá para saber si se ha guardado o no
Me.Text = guardadoComo & System.IO.Path.GetFileName(nombre)
Guardado = True
End Sub
Private Sub btnGuardar_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnGuardar.Click
Dim sFD As New System.Windows.Forms.SaveFileDialog
With sFD
.Title = "Guardar la captura"
.FileName = Me.FileName
.Filter = "PNG|*.png|JPG|*.jpg;*.jpeg|GIF|*.gif|BMP|*.bmp|TIFF|*.tif" & _
"|Metafile (*.wmf;*.emf)|*.wmf;*.emf|Icono|*.ico"
If .ShowDialog = System.Windows.Forms.DialogResult.OK Then
Dim ext As String = System.IO.Path.GetExtension(.FileName).ToLower
Select Case ext
Case ".png"
picClipB.Image.Save(.FileName, ImageFormat.Png)
Case ".jpg", "*.jpeg"
picClipB.Image.Save(.FileName, ImageFormat.Jpeg)
Case ".gif"
picClipB.Image.Save(.FileName, ImageFormat.Gif)
Case ".bmp"
picClipB.Image.Save(.FileName, ImageFormat.Bmp)
Case ".tif", ".tiff"
picClipB.Image.Save(.FileName, ImageFormat.Tiff)
Case ".wmf"
picClipB.Image.Save(.FileName, ImageFormat.Wmf)
Case ".emf"
picClipB.Image.Save(.FileName, ImageFormat.Emf)
Case ".ico"
picClipB.Image.Save(.FileName, ImageFormat.Icon)
Case Else
picClipB.Image.Save(.FileName, ImageFormat.Png)
End Select
labelInfo.Text = "Imagen guardada como " & ext.ToUpper
' Mostrar el nombre (31/Dic/07)
' Esto servirá para saber si se ha guardado o no
Me.Text = guardadoComo & System.IO.Path.GetFileName(.FileName)
Guardado = True
End If
End With
End Sub
Private Sub btnTamañoNormal_Click(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnTamañoNormal.Click
'picClipB.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Normal
'' Cambiar el tamaño del pictureBox
'' para que se muestre el scroll del contenedor si fuera necesario
'picClipB.Size = picClipB.Image.Size
picClipB.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize
panelPic.Size = picClipB.Size
End Sub
Private Sub btnStretch_Click(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnStretch.Click
picClipB.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage
' Ajustar el pictureBox al tamaño interno del panel
picClipB.Size = panelPic.ClientSize
End Sub
Private Sub fPicPreview_FormClosing(ByVal sender As Object, _
ByVal e As FormClosingEventArgs) _
Handles Me.FormClosing
' Si se cierra el formulario y no se ha guardado (31/Dic/07)
If e.CloseReason = CloseReason.UserClosing AndAlso Me.Guardado = False Then
If MessageBox.Show("La imagen no se ha guardado." & vbCrLf & _
"¿Quieres guardarla?", _
"Preview de capturas", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Question _
) = System.Windows.Forms.DialogResult.Yes Then
btnGuardar_Click(Nothing, Nothing)
End If
End If
End Sub
Private Sub fPicPreview_Load(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles MyBase.Load
If My.Computer.Clipboard.ContainsImage Then
picClipB.Image = My.Computer.Clipboard.GetImage
labelInfo.Text = "Imagen recuperada"
' Mostrarla al tamaño normal
btnTamañoNormal.PerformClick()
Else
labelInfo.Text = "No hay imagen en el portapapeles"
Me.btnGuardar.Enabled = False
Me.btnStretch.Enabled = False
Me.btnTamañoNormal.Enabled = False
End If
End Sub
Private Sub Panel1_Resize(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles panelPic.Resize
If picClipB.SizeMode = PictureBoxSizeMode.StretchImage Then
picClipB.Size = panelPic.ClientSize
End If
End Sub
End Class
El código del formulario principal (Form1)
'------------------------------------------------------------------------------
' Capturar la pantalla o la ventana activa (26/Dic/07)
'
' Basado en un ejemplo de Miliuco:
' http://www.elguille.info/colabora/puntoNET/miliuco_captura.htm
'
' ©Guillermo 'guille' Som, 2007
'------------------------------------------------------------------------------
Option Strict On
Imports Microsoft.VisualBasic
Imports System
Imports System.Windows.Forms
Public Class Form1
' Nuevos valores para saber si se ha guardado, etc. (31/Dic/07)
Private m_HePreguntadoGuardar As Boolean = False
Private m_GuardarTodas As Boolean = False
Private m_CuantasCapturas As Integer = 0
Private Enum TiposCaptura
Ventana
Pantalla
End Enum
Private tipoCaptura As TiposCaptura = TiposCaptura.Pantalla
Private Sub btnVentana_Click(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnVentana.Click
Me.WindowState = FormWindowState.Minimized ' formulario minimizado
tipoCaptura = TiposCaptura.Ventana
timerCaptura.Interval = CInt(txtRetardo.Value * 1000)
timerCaptura.Start()
End Sub
Private Sub btnPantalla_Click(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnPantalla.Click
Me.WindowState = FormWindowState.Minimized ' formulario minimizado
tipoCaptura = TiposCaptura.Pantalla
timerCaptura.Interval = CInt(txtRetardo.Value * 1000)
timerCaptura.Start()
End Sub
Private Sub timerCaptura_Tick(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles timerCaptura.Tick
timerCaptura.Stop()
If tipoCaptura = TiposCaptura.Ventana Then
' envía la pulsación de la tecla especificada (Impr Pant)
' 1 pulsación de Alt + Impr Pant para capturar la ventana activa
SendKeys.SendWait("%{PRTSC}")
Else
' envía la pulsación de la tecla especificada (Impr Pant)
' 2 pulsaciones de Impr Pant para capturar la pantalla entera
SendKeys.SendWait("{PRTSC 2}")
End If
Me.WindowState = FormWindowState.Normal
Me.Activate()
' Habilitar el botón de mostrar solo si hay una imagen
' en el portapapeles
btnMostrar.Enabled = My.Computer.Clipboard.ContainsImage
End Sub
Private Sub btnMostrar_Click(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnMostrar.Click
' Abrir la venta de previsualización
' Se pueden abrir la cantidad que quiera, con idea
' de hacer varias capturas y poder ir guardándolas
Dim fPreview As New fPicPreview
' incrementar el valor de las capturas (31/Dic/07)
m_CuantasCapturas += 1
fPreview.FileName = "Captura_" & m_CuantasCapturas.ToString("00") & ".png"
fPreview.Show()
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, _
ByVal e As FormClosingEventArgs) _
Handles Me.FormClosing
' Comprobar si se han guardado las imágenes (31/Dic/07)
m_HePreguntadoGuardar = False
' Uso la colección OpenForms para preguntarle si se ha guardado o no
If My.Application.OpenForms.Count > 0 Then
For Each f As Form In My.Application.OpenForms
If TypeOf f Is fPicPreview Then
Dim fPrev As fPicPreview = TryCast(f, fPicPreview)
If fPrev.Guardado = False Then
If m_HePreguntadoGuardar = False Then
If MessageBox.Show("La imagen no se ha guardado." & vbCrLf & _
"¿Quieres guardarla?" & vbCrLf & _
"(Pulsa SI para guardar todas las que no se hayan guardado)", _
"Preview de capturas", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Question _
) = System.Windows.Forms.DialogResult.Yes Then
m_GuardarTodas = True
Else
m_GuardarTodas = False
End If
m_HePreguntadoGuardar = True
End If
If m_GuardarTodas Then
fPrev.Guardar()
End If
End If
End If
Next
End If
End Sub
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles Me.Load
btnMostrar.Enabled = My.Computer.Clipboard.ContainsImage
If EsAdministrador() Then
picAdmin.Image = My.Resources.escudo16_OK
picAdmin.ToolTipText = "Ejecutando como administrador"
Else
picAdmin.Image = My.Resources.escudo16_Exclamation
picAdmin.ToolTipText = "No eres administrador, " & _
"es posible que algunas ventanas no se capturen"
End If
End Sub
''' <summary>
''' Averiguar si se ejecuta como administrador
''' </summary>
''' <returns>
''' Verdadero o falso según se ejecute como administrador o no
''' </returns>
''' <remarks>
''' Parte del código por Adam Braden
''' </remarks>
Private Function EsAdministrador() As Boolean
My.User.InitializeWithWindowsUser()
Return My.User.IsInRole(ApplicationServices.BuiltInRole.Administrator)
End Function
End Class