Print Screen em Java

Não se esqueça que no exemplo ele definiu pra dormir por 10 segundos, o que pode parecer que ficou travado.

agora que esqueci de um detalhe, tem que sair as imagens renomeadas,

img1
img2
img3

senao vai ficar substituindo direto

faiz um contador tpw int i=1;
quando vc tira um pra salva vc usa

ImageIO.write(bi, "jpg", new File("D://img"+i+".jpg"));// Salva a imagem     
i++;

Veja:

import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;

public class PrintScreen extends JFrame {

	private static final long serialVersionUID = 1L;
	private static final Rectangle ALL_SCREEN = new Rectangle(Toolkit
			.getDefaultToolkit().getScreenSize());
	private JButton startOrStopButton;
	private Timer timer;
	private Robot robot;
	private int counter;

	public PrintScreen() throws AWTException {
		intialize();
	}

	private void intialize() throws AWTException {
		robot = new Robot();
		add(getStartOrStopButton());
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setSize(200, 200);
		setLocationRelativeTo(null);
	}

	private JButton getStartOrStopButton() {
		if (startOrStopButton == null) {
			startOrStopButton = new JButton();
			startOrStopButton.setText("Iniciar");
			startOrStopButton.addActionListener(new PrintScreenListener());
		}
		return startOrStopButton;
	}

	private class PrintScreenListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			if (timer == null) {
				timer = new Timer("printScreen", true);
				timer.schedule(new PrintScreenTask(), 0, 5000);
				startOrStopButton.setText("Parar");
			} else {
				timer.cancel();
				timer = null;
				startOrStopButton.setText("Iniciar");
			}
		}

	}

	private class PrintScreenTask extends TimerTask {

		@Override
		public void run() {
			BufferedImage print = robot.createScreenCapture(ALL_SCREEN);
			try {
				ImageIO.write(print, "png", File.createTempFile("image"
						+ counter++, ".png"));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) throws AWTException {
		new PrintScreen().setVisible(true);
	}

}

As imagens são salvas na pasta temporária do sistema. Você pode armazenar os objetos File que apontam para elas em um List para depois ter acesso a essas imagens (basta fazer algumas pequenas mudanças no método run() de PrintScreenTask.

hmm, vlw, irei modificar ele, vlw pela ajuda, este pra eu mudar se acrescentar o diretorio da certo:: D;//image…

Eu ja usei isso…
Ta aki: (bate foto da tela inteira, e grava em arquivos .png)

[code]import javax.swing.;
import java.awt.
;
import java.awt.event.;
import java.io.
;
import java.awt.image.;
import javax.imageio.
;

public class TakeShoots {
private BufferedImage image;
private Robot robot;
private int padLeft, padTop, w, h;

public TakeShoots() {
        // settings for game canvas
        padLeft = 185;
        padTop = 209;
        w = 640;
        h = 480;

        try {
            robot = new Robot();                    
        } catch (AWTException e) {

        }            
       
        System.out.println("Waiting 5 seg...");

        try {        
    Thread.sleep(5000);
  } catch (InterruptedException e){
 
  }

        System.out.println("Initializing thread...");
        TSThread t = new TSThread(3000);
        t.start();

    }

    class TSThread extends Thread {
     int howManyTimes;
             File file;

     TSThread(int times) {
         this.howManyTimes = times;
     }

     public void run() {
         for(int i = 0; i <= this.howManyTimes; i++){
                       image = robot.createScreenCapture(new Rectangle(padLeft, padTop, w, h));
                            file = new File("image"+i+".png");

                            try{                                
                                ImageIO.write(image,"png", file);
                            }catch(IOException e){
                               
                            }

                            file = null;
                            image = null;              

                            try {
                Thread.sleep(100); //Time bettwen each photo
                    } catch (InterruptedException e){
                   
                    }

         }
     }
 }

    public static void main(String args[]){
        new TakeShoots();
    }

}[/code]

Ah, e se vc kizer comparar 2 fotos, tem esse geito daki…
Por exemplo, se vc kizer fazer um keylogger que bata foto e envia pro seu email, vc faz a comparação… se 2 fotos forem iguais ele envia soh 1…
Basta alterar o código que eu postei ali em cima e aumentar o tempo da thread (onde ta 100).
Peguei esse exemplo no site do Carlan+Calazans.
É um geito meio paia, porque ele compara pixel por pixel da imagem, mas já ajuda !

[code]
import javax.swing.;
import java.awt.
;
import java.awt.event.;
import java.io.
;
import java.awt.image.;
import javax.imageio.
;

public class CompareImages {
private BufferedImage image1, image2;
private String filename1, filename2;

public CompareImages() {                
            loadImages();
           
            long started = System.currentTimeMillis();
            boolean result = compareImage(image1, image2);
            System.out.println( (System.currentTimeMillis()) - started + " ms.");
            System.out.println("Result: " + result);
    }

    private void loadImages(){
            filename1 = "ball.png";
            filename2 = "ball.png";

            try{                
                image1 = ImageIO.read(new File(filename1));
                image2 = ImageIO.read(new File(filename2));
            }catch(IOException e){
               
            }
    }

    private boolean compareImage(BufferedImage image1, BufferedImage image2) {
                    if(image1.getWidth() != image2.getWidth() || image1.getHeight() != image2.getHeight())
                            return false;

                    for(int x = 0; x < image1.getWidth(); x++) {
                    for(int y = 0; y < image1.getHeight(); y++) {
                                    if(image1.getRGB(x, y) != image2.getRGB(x, y))
                                           return false;
                    }
                }
                return true;
 }

    public static void main(String args[]){
        new CompareImages();
    }

}[/code]

vlw, agora deu certim o que vc passou tira foto sem sequencia em determinando tempo, so vou ajeitar ele do jeito que precisso, vlw mesmo a ajuda :wink:

agora vou na luta de como upar estas imagens automaticamente para uma pasta de um servidor web :evil:

Fico feliz em ter ajudado!
Agora a pergunta que não se cala… Quer usar pra q? Para keylogger? HUAHUuHAhua

Zuera T_T

Se sua dúvida foi resolvida, vá ao primeiro tópico, clique em editar, e acrescente [RESOLVIDO] no assunto!
Flws !

nao nao, ja passei desta fase de curiosidade keyloguer e afins é um sistema que to criando para games, para tirar fotos da tela do jogador para ver se ta roubando nos jogos, ae to criando um para tirar fotos da tela, pegar os processos que estão na maquina e upar isso para um servidor, automaticamente :wink:

se souber de algo mais que possa me ajduar neste ponto agraderia :wink:

Só tome um pouco de cuidado com o seguinte:

  1. Esse comportamento deve estar bem explícito na licença do jogo.
  2. O envio de informações pode atrapalhar o game play (consumo excessivo da rede, sem necessidade).
  3. O jogo pode ser considerado um screenlogger por alguns antivírus devido ao seu comportamento: faz uma captura de tela e manda para a rede.

isso nao sera para o jogo e sim, é um aplicativo a parte que deve ser aberto antes do jogo

e um sistema de proteção para os organizadores do campeonato daquee jogo possa verificar se esta tudo correto

[quote=fmda]isso nao sera para o jogo e sim, é um aplicativo a parte que deve ser aberto antes do jogo

e um sistema de proteção para os organizadores do campeonato daquee jogo possa verificar se esta tudo correto[/quote]
Entendi. De qualquer forma, o comentário acima ainda se aplica.

[quote=marcobiscaro2112]Só tome um pouco de cuidado com o seguinte:

  1. Esse comportamento deve estar bem explícito na licença do jogo.
  2. O envio de informações pode atrapalhar o game play (consumo excessivo da rede, sem necessidade).
  3. O jogo pode ser considerado um screenlogger por alguns antivírus devido ao seu comportamento: faz uma captura de tela e manda para a rede.[/quote]
    Com certeza…
    Ainda mais que, Mesmo que você fassa um algorítimo para bater fotos só quando o jogo estiver aberto, a pessoa pode estar com o jogo aberto e com uma janela do msn na tela no momento da captura… Seria considerado um screenlogger, e você teria acesso a informações pessoais…
    Se você está fazendo o jogo, você pode fazer o algorítimo para bater fotos sempre da tela do jogo, mesmo que ela esteja minimizada…
    Boa sorte, Flws !

por que ele tem que ser o desenvolvedor do game para poder criar um programa assim ? não existe nenhuma forma de fazer isso mesmo não tendo acesso ao código do game ?

eu jogava uns joguinho online aqui e já pensei nessa possibilidade mas eu pensei em colocar tipo um botão que ao ser pressionado execute a ação assim os jogadores que ficarem desconfiados de outros jogadores em uma determinada hora seguindo regras para que não haja abusos afim de prejudicar o servidor do game podem ter certeza do que está acontecendo no frame do outro jogador.

eu não saberia nem desenvolver o botão, sou muito beginner em programação mas estou dando os primeiros passos, alguem aqui tem uma idéia melhor que a minha para nosso amigo ai ?

por que ele tem que ser o desenvolvedor do game para poder criar um programa assim ? não existe nenhuma forma de fazer isso mesmo não tendo acesso ao código do game ?

eu jogava uns joguinho online aqui e já pensei nessa possibilidade mas eu pensei em colocar tipo um botão que ao ser pressionado execute a ação assim os jogadores que ficarem desconfiados de outros jogadores em uma determinada hora seguindo regras para que não haja abusos afim de prejudicar o servidor do game podem ter certeza do que está acontecendo no frame do outro jogador.

eu não saberia nem desenvolver o botão, sou muito beginner em programação mas estou dando os primeiros passos, alguem aqui tem uma idéia melhor que a minha para nosso amigo ai ? [/quote]

Bom… Se ele não está desenvolvendo o jogo, e quer que bata as fotos dos players online como ele iria fazer? -.-
Ele ateh pode conseguir fazer bater foto do jogo com ele minimizado, sem ser o desenvolverdor do jogo, mas ele vai ter que ter acesso ao protocolo do jogo, ou usar alguma API desponibilizada…
Se não tiver API, ele vai ter que usar engenharia reversa para poder descubrir algumas coisas sobre o protocolo…
Se ele for usar o robot ele só vai bater foto da tela, mesmo se tiver outra coisa nela…
A não ser que ele faça um algorítimo de comparação para ver se a imagem do título da página coincide com a imagem do título do jogo…

hm entendi , obrigado… mas eu preciso estudar mais pra entender esses termos que voce utilizo hehe.

** DESCULPEM REVIVER O TÓPICO **

Estou desenvolvendo algo como o amigo ai disse …

Um aplicativo para rodar em background no momento em que algum jogo estiver rolando para fazer uma auditoria do ambiente do player afim de pegar alguma situação de trapaça.

Eu cheguei a conclusão que eu preciso tirar as screeshots somente quando o vídeo estiver em OPENGL que é o modo mais comum de jogos.

Eu vou usar a biblioteca SWT Extension da Eclipse para conseguir as informações da máquina do usuário.

A maior dificuldade no momento é conseguir fazer a screenshot do OPENGL do jogador. Estou ainda pesquisando … se alguém já fez ou tiver alguma sugestão, será muito benvinda.

[]'s

Consegui fazer usando a biblioteca http://jogamp.org/