Tutorial C# – PrintScreen
No desenvolvimento de aplicações, a gestão dos erros do programa é dos aspectos mais importantes. Não só para ajudar a identificar o respetivo erro, como também para melhorar o próprio software. Mas nem sempre é fácil perceber o que originou o erro, e o que o cliente estava a executar naquele preciso momento.
Um “printscreen” por vezes é sem dúvida muito importante para identificarmos qual o momento em que o erro “surgiu”, mas aqui temos um ponto problemático, por mais incrível que pareça, existem muitos utilizadores que não sabem como fazer um “printscreen” e depois guardar a imagem.
Para ultrapassar a falta de conhecimento de alguns utilizadores, nada melhor do que o software efectuar o “printscreen” sozinho.
Este é um procedimento extremamente simples, mas já encontrei na internet tutoriais incrivelmente complexos para efectuar “printscreen” numa aplicação em C#.
Neste tutorial abordarei três “tipos” de “printscreen”.
- PrintScreen a todo o ecrã (directo para o desktop)
- PrintScreen apenas à aplicação (directo para o desktop)
- PrintScreen apenas à aplicação (com escolha do caminho para guardar imagem)
Para começar, é necessário que a aplicação tenha os seguintes elementos.
- Picture box (apenas para ter uma imagem na aplicação)
- Botão para PrintScreen a todo o ecrã
- Botão para PrintScreen apenas à aplicação
- Botão para PrintScreen com escolha do caminho para guardar imagem
Como poderão verificar, o código é extremamente simples.
PrintScreen a todo o ecrã (directo para o desktop)
Temos de adicionar o seguinte namespace
<a href="https://pplware.sapo.pt/wp-content/uploads/2013/02/codigo_prt01.jpg"><img src="https://pplware.sapo.pt/wp-content/uploads/2013/02/codigo_prt01-720x432.jpg" alt="" width="720" height="432" class="aligncenter size-medium wp-image-914539" /></a> |
E desta forma extremamente simples, já conseguimos efectuar o printscreen do ecrã.
O PrintScreen de todo ecrã é interessante, mas pode ser considerado intrusivo caso estejamos apenas a efectuar esse PrintScreen para analisar um possível erro.
Neste caso, é preferível apenas capturar a imagem do programa.
O código para este caso é semelhante ao anterior, pelo qual também é bastante simples.
Aproveito também para demonstrar outra forma de definir o bitmap.
PrintScreen apenas à aplicação (directo para o desktop)
Com um código praticamente igual ao anterior, alterando apenas onde o PrintScreen é “iniciado”, conseguimos capturar apenas a aplicação.
<a href="https://pplware.sapo.pt/wp-content/uploads/2013/02/codigo_prt02.jpg"><img src="https://pplware.sapo.pt/wp-content/uploads/2013/02/codigo_prt02-720x245.jpg" alt="" width="720" height="245" class="aligncenter size-medium wp-image-914540" /></a> |
PrintScreen apenas à aplicação (com escolha do caminho para guardar imagem)
Para que seja possível ao utilizador escolher onde guardar a imagem, basta efectuar uma alteração na parte final do código.
Após definirmos qual a área a ser copiada.
<a href="https://pplware.sapo.pt/wp-content/uploads/2013/02/codigo_prt03.jpg"><img src="https://pplware.sapo.pt/wp-content/uploads/2013/02/codigo_prt03-720x30.jpg" alt="" width="720" height="30" class="aligncenter size-medium wp-image-914542" /></a> |
Inserimos o seguinte código:
<a href="https://pplware.sapo.pt/wp-content/uploads/2013/02/codigo_prt04.jpg"><img src="https://pplware.sapo.pt/wp-content/uploads/2013/02/codigo_prt04-720x247.jpg" alt="" width="720" height="247" class="aligncenter size-medium wp-image-914543" /></a> |
Em realce, podemos verificar o título deste “Save Image Dialog” e a extensão.
Como puderam verificar, é extremamente simples efectuar um PrintScreen através de uma aplicação em C#, sem ser necessário importar dll’s do Windows como cheguei a visualizar em tutoriais na internet.
Download: Código Fonte
Este artigo tem mais de um ano
Isto é porreiro. Já tive oportunidade de pesquisar sobre este tema na web, e na grande maioria era necessário importar dll’s do windows. Continuação de bom trabalho pplware.
Diogo Silva
Mt bom.. Obg!
Já programei em C mas C# nunca.
Como é que compilo isso?
Boas Paulo,
para programar em C# (e posterior compilação) necessitas da ferramenta Microsoft Visual Studio.
Podes programar em várias línguas, sendo o C# uma delas.
Espero ter ajudado.
mehhh não tenho nada disso. Obrigado.
Não se arranjar por aí isso? 😉
Claro que sim, a Microsoft disponibiliza versões gratis do Visual Studio, denominada Express. Apenas tens de escolher qual queres (podes ter vários instalados):
http://www.microsoft.com/visualstudio/eng/products/visual-studio-express-for-windows-desktop
http://www.microsoft.com/visualstudio/ptb/products/visual-studio-express-products
Express é a versão trial do produto
Olá Paulo boa tarde,
Para ter o Visual Studio é necessário pagar uma licença, no entanto, pode fazer o download da versão Express na Microsoft, versão essa que é free.
Cumprimentos.
A ideia era arranjarem-me o programa já compilado e pronto a usar, para não ter de instalar o programa. Visto que o código fonte está aí disponível.
De qualquer maneira estou a instalar.
Obrigado na mesma
Caro Paulo,
Se fizer download do código fonte, terá uma pasta com o nome bin e dentro dessa pasta terá outra com o nome debug. Aí terá acesso ao executável.
Cumps.
Hélio Moreira
Muito bom tutorial. brigado. 😉
Quem desenvolve uma aplicação não cria um mecanismo de print screen para identificar erros, as imagens são demasiado pesadas em espaço e pouco vão informar sobre o problema que ocorreu.
Normalmente é gerado log para um ficheiro ou base de dados, o utilizador poderá ou não enviar um print screen para ajudar caso a aplicação mostrar uma mensagem de erro.
Caro fil,
Antes de mais agradeço o seu comentário.
O printscreen é apenas mais uma ajuda para tentar identificar o erro. O log é fundamental, e vou preparar um tutorial sobre esse tema.
Mas como o próprio diz “o utilizador poderá ou não enviar um print screen para ajudar caso a aplicação mostrar uma mensagem de erro.”, e eu pergunto: E a quantidade de utilizadores que não sabem fazer um printscreen e guardar imagem?
Volto a reforçar que o printscreen é um complemento a um ficheiro de logs / erros.
Cumps,
Hélio Moreira
Boas Hélio!
Bom tutorial, recentemente fiz algo parecido e que penso ser interessante no ambito do que estás a fazer.
Passa por colocar um 4º botão em que fazes printscreen a uma janela de um processo expessifico através do handler deste. No caso fiz esse pequeno projecto associado a uma library open source de OCR (tesseract) para resolver uns catpchas…
fica só a sugestão do quarto botão.
Caro Pedro,
Não queres fazer um tutorial sobre essa opção 🙂
Cumps,
Hélio Moreira
Hélio,
Terei todo o gosto em acrescentar o 4º botao e fazer um capture de uma aplicação em especifico.
prefiro retirar a parte do OCR que isso provavelmente em pouco iria ajudar os leitores que se estão a iniciar.
… e para quem não tem conhecimentos de programação… poderá sempre recorrer, por exemplo, ao software gratuito PhotoScape que não só trata imagem como tem outras ferramentas entre elas captura de écran…
qual é lógica de ter um programa destes para tirar printscreen a por exemplo um erro que aparece durante a execução de outro programa quando ao tirar um printscreen aparece este programa em primeiro plano?
Caro Carlos,
O objectivo não é usar este programa para tirar “printscreens” de outros programas, mas sim para tirar o “printscreen” na execução do programa por nós desenvolvido e que em determinado momento deu erro.
Imagina o seguinte cenário:
Desenvolves-te um programa, e por algum motivo não fizes-te uma validação necessária.
Quando o programa “estoura”, além de gravar num ficheiro de logs, era interessante que tirasse um “printscreen” do ecrã onde deu o erro… Dessa forma pode ser mais fácil perceber o que o utilizador fez que causasse aquele erro.
Cumps,
Hélio Moreira
ok. agora percebi.
já agora porque está ali aquela picturebox? podia estar a ser utilizada neste exemplo para apresentar a imagem do printscreen
A picture box foi colocada por dois motivos:
– “Embelezar” o programa 🙂
– Visualizar o printscreen
Para não complicar, este segundo ponto fica para outro tutorial.
Cumps,
Hélio M
Mas é possivel tirar um printScreen de qq outra aplicação.
“process.handler”
Muito bom, ainda à poucos dias mandei um bug report para o Chromium e se não me engano juntamente envia um screenshot automático, logo está provada a utilidade deste código. Muito bom especialmente se o bug for no “user interface”.
Obrigado pelo bom trabalho.
O código de print screen auto até é porreiro sugiro que o completas o teu exemplo com o código de o anexar automaticamente a um email e o enviar por SMTP ou o guardar em ficheiro e enviar por FTP.
Mas sou da opinião que o print screen neste tipo de situação não traz benefícios. No caso da linguagem C# quando houver um erro e se o programa estiver bem implementado será apanhado uma exception e mostrado uma mensagem de erro simpática para o user. Neste tipo de situação o que se quer é o stacktrace e valores de variáveis e não um print screen da mensagem “simpática” do erro de código real.
Em relação a anexar o printscreen é uma ideia bastante interessante. E não é de difícil implementação…
A ideia neste caso do print screen é que o mesmo seja executado mesmo antes da excepcion, pois no caso de existir um form com vários campos, podemos rapidamente identificar onde ocorreu o erro. Contudo, este código de printscreen serve para inúmeros casos e não só para o registo de erros.
Cumps.
Hélio Moreira
Deveriam fazer mais deste gênero (por exemplo não consigo perceber aqueles tutorial de bases de dados pois ainda não tenho as bases necessárias e com este tutorial sem bases nesta linguagem consegui)para o pessoal ainda novo na programação evoluir mais rapidamente.
Eu não vejo grande utilidade nisto, pois o windows tem atalhos para o fazer!
Caro David,
Respondo ao seu comentário com um parágrafo do tutorial:
“(…)por mais incrível que pareça, existem muitos utilizadores que não sabem como fazer um “printscreen” e depois guardar a imagem.”
Cumps,
Hélio Moreira
Hélio teria alguma forma de fazer um PrintScreen de um programa especifico que estiver rodando, por exemplo, se eu tenho o torrent.exe aberto tirar um print dele e mostra na picturebox
Porreiro era isto mas para asp.net com C#…
Excelente artigo. Parabéns 🙂
Sem dúvida que gosto da iniciativa e acho que devem continuar, no entanto não posso deixar de reparar que a solução peca por falta de controlo da memória, ou seja, falta fazer Dispose() a todos os elementos gráficos e mesmo à caixa de diálogo de Save File! 😉
Como pode ser feito para que sempre salve com um nome diferente a imagem?
Muito bom, obrigado pelo post!