C# - Salvando telas de forma automática em um período


Hoje vamos criar um pequeno projeto usando a linguagem C# que vai permitir salvar telas de forma automática em um período de tempo definido.

Publico com frequência pequenos exemplos de programas feitos em uma determinada linguagem com objetivo de mostrar a utilização de um recurso da linguagem para fins de estudo.

Hoje veremos um programa feito na linguagem C# que permite salvar telas de forma automática em um período de tempo definido pelo usuário e armazenar as imagens em uma pasta específicada.

O objetivo é mostrar como usar os controles Timer, NumericUpDown, FolderBrowserDialog e salvar imagens usando recursos do namespace System.Drawing como Bitmap e Graphics e os métodos CopyFromScreen e Save.

Criando o projeto no VS 2017 Community

Crie um novo projeto do tipo Windows Forms App(.NET Framework) no Visual Studio 2017 Community com o nome de ScreenShot.

No formulário padrão Form1.cs inclua os seguintes controles:

Disponha os controles conforme o leiaute abaixo:

1- Os namespaces usados no projeto :

using System;
using System.Drawing;
using System.Windows.Forms;

2 - No início do formulário vamos definir as variáveis

int frequencia;
int intervalo = 1000;
int contador = 0;

Defina também a variável que define o caminho onde as telas serão salvas:

string caminhoSalvarImagem = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);

3 - No evento Load do formulário inclua o código abaixo atribui o caminho na caixa de texto, e exibe o número de telas salvas e ative o tempo em minutos:

        private void Form1_Load(object sender, EventArgs e)
        {
            txtLocal.Text = caminhoSalvarImagem;
            lblTelasSalvas.Text = contador.ToString();
            //define em minutos o salvamento de tela
            rdbMinutos.Checked = true;
        }

4- No evento Click do botão de comando usamos o controle FolderBrowserDialog para selecionar outra patas para salvar as imagens das telas:

       private void btnLocal_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog fbd1 = new FolderBrowserDialog();
            // Define as propriedades do controle FolderBrowserDialog
            fbd1.Description = "Selecione uma pasta para realizar o Backup";
            fbd1.RootFolder = Environment.SpecialFolder.MyComputer;
            fbd1.ShowNewFolderButton = true;
            // Exibe a caixa de diálogo
            if (fbd1.ShowDialog() == DialogResult.OK)
            {
                // Exibe a pasta selecionada
                txtLocal.Text = fbd1.SelectedPath;
                caminhoSalvarImagem = fbd1.SelectedPath;
            }
        }

5 -  A seguir no evento CheckedChanged do controle CheckBox temos o código que define o temporizador para salvar a tela em um determinado período de tempo:

        private void cbAtivar_CheckedChanged(object sender, EventArgs e)
        {
            // define o temporizador para salvar a tela
            if (cbAtivar.Checked)
            {
                if (rdbSegundos.Checked)
                {
                    frequencia = Convert.ToInt32(nupdTempo.Value) * (intervalo * 1); // segundos
                }
                if (rdbMinutos.Checked)
                {
                    frequencia = Convert.ToInt32(nupdTempo.Value) * (intervalo * 60); // minutos
                }
                if (rdbHoras.Checked)
                {
                    frequencia = Convert.ToInt32(nupdTempo.Value) * (intervalo * 3600); // horas
                }
                // ativar o timer
                timerSalvarTela.Interval = frequencia;
                timerSalvarTela.Enabled = true;
            }
            else
            {               
                timerSalvarTela.Enabled = false; // para o timer            }
        }

5 - O evento Tick do controle Timer timerSalvaTela temos o código que salva a tela

          private void timerSalvaTela_Tick(object sender, EventArgs e)
        {
            try
            {
                // salva a tela
                Bitmap svTela = new Bitmap(Screen.PrimaryScreen.WorkingArea.Width,
Screen.PrimaryScreen.WorkingArea.Height);
                Graphics svTelaArquivo = Graphics.FromImage(svTela);
                svTelaArquivo.CopyFromScreen(0, 0, 0, 0, new Size(svTela.Width, svTela.Height));
                svTela.Save(caminhoSalvarImagem + @"\tela_" + DateTime.Now.ToString("ddMMyyyyHHmmss") + ".png");
                contador = contador + 1;
                lblTelasSalvas.Text = contador.ToString();
            }
            catch (Exception exc)
            {
                // houve erro, exibe
                cbAtivar.Checked = false;
                MessageBox.Show("Ocorreu um erro , a tela não foi salva." + Environment.NewLine
+ Environment.NewLine + "Technical details:" + Environment.NewLine + exc.Message);
            }
        }

6 - Para exibir a hora atual usamos o evento Tick o controle Timer1:

       private void timer1_Tick(object sender, EventArgs e)
        {
            this.lblRelogio.Text = DateTime.Now.ToString();
        }
 

Executando o projeto iremos obter o seguinte resultado:

Pegue o código do projeto aqui:  ScreenShot.zip

"Porque há um só Deus, e um só Mediador entre Deus e os homens, Jesus Cristo homem."
1 Timóteo 2:5


 
Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti