el Guille, la Web del Visual Basic, C#, .NET y más...

Capturar pantalla v1.0.2.8

 
Publicado el 31/Dic/2007
Actualizado el 31/Dic/2007
Autor: Guillermo 'guille' Som

Revisión de la utilidad de capturar la pantalla o la ventana activa que avisa si las imágenes no se han guardado y las guarda automáticamente en la carpeta de My Picures.



 

Introducción:

En esta revisión he añadido la posibilidad de avisar cuando las imágenes no se han guardado, además de que el nombre predeterminado de cada imagen es diferente, empezando por 1 para la primera captura y así sucesivamente.

Si se cierra una de las ventanas de previsualización y no se ha guardado, se pregunta si se quiere guardar, pudiendo elegir dónde guardarlo, el formato y el nombre.

Sin embargo, si se cierra la ventana principal y hay capturas que no se han guardado, simplemente se pregunta si se quieren guardar (solo pregunta una vez) y si se le dice que sí, se guardarán en la carpeta de My Pictures (o como se llame en tu Windows esa carpeta "especial"). En el caso de que haya una imagen con ese nombre (por ejemplo, porque se hayan guardado de veces anteriores), se añade la fecha y hora al nombre de la captura, con idea de que no se eliminen las que hubiera.

 

Creo que son cambios que valen la pena, así que... te recomiendo que te bajes el ZIP con el código para el Visual Basic 2008, y si no quieres el código... pues... también te lo bajas, porque dentro de ese ZIP está el ejecutable, que necesita el .NET Framework 2.0 para funcionar.

 

Si quieres ver el código de Visual Basic con los nuevos cambios, puedes verlo en esta misma página.
(Incluyo el código completo de los dos formularios.)

 

Espero que te sea de utilidad y ahora lo captures mejor ;-))))

Nos vemos.
Guillermo


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

 


 


La fecha/hora en el servidor es: 23/12/2024 19:41:56

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024