Print Screen em Java

Olá, eu estou querendo criar uma aplicação basica mesmo, do tipo, a cada X segundos ele tira uma foto da tela, alguem pode me ajudar neste ponto, caso ja tenha algum aqui pronto no laboratorio de script, ou alguns amterias de ajuda?

eu criei assim, porem nao to intendendo como fazer para a cada X segundos tirar foto, porque deste jeito ele tira foto so quando eu clicar no botao e mesmo assim uma foto, apenas

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { int i=1; while (i<20) { try{ Robot robot = new Robot(); BufferedImage bi = robot.createScreenCapture(new // Captura a tela na àrea definida pelo retângulo Rectangle(0, 0, 1440, 900)); // aqui vc configura as posições xy e o tam da área que quer capturar ImageIO.write(bi, "jpg", new File("D://tela.jpg"));// Salva a imagem } catch(AWTException e){ e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } i++; } }

acho q vc pode usar Thread.sleep(x);
eu nao sei mais acho q o x é em milesegundos.

vc tem algum exemplo para eu ver, ou me ensinar a como editar neste arquivo, é que meu nivel é basico, estoua te procurando algum exemplo pronto pra facilitar, pq tbm prcisso fazer upload deste arquivo em um ftp, porem agora mesmo é como fazer isso

eu tbm sou iniciante nao sei se esta certo.
tenta assim:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { //Loop infinito while (true) { try{ Robot robot = new Robot(); BufferedImage bi = robot.createScreenCapture(new // Captura a tela na àrea definida pelo retângulo Rectangle(0, 0, 1440, 900)); // aqui vc configura as posições xy e o tam da área que quer capturar ImageIO.write(bi, "jpg", new File("D://tela.jpg"));// Salva a imagem } catch(AWTException e){ e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } try { //pode mudar aqui o tempo em milessegundos Thread.currentThread().sleep(10000); } catch(Exception e) { } } }

assim ele travou a aplicacao toda euawheuwe

Vc pode utilizar as classes Timer e TimerTask que permitem que vc agende uma tarefa para ser executada em um determinado intervalo de tempo, essa seria a solução mais elegante, basta dar uma lida no javadoc ou procurar no google.
Mas vc tb pode utilizar o método Thread.sleep(), tenta colocar ele dentro do seu bloco try, assim:

ImageIO.write(bi, "jpg", new File("D://tela.jpg"));// Salva a imagem 
Thread.sleep(5000); //Congela a thread a cada 5 segundos.

Boa sorte!

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 !