首页 > 编程 > Java > 正文

Java模拟QQ桌面截图功能实现方法

2019-11-26 15:05:19
字体:
来源:转载
供稿:网友

本文实例讲述了Java模拟QQ桌面截图功能实现方法。分享给大家供大家参考。具体如下:

QQ的桌面截图功能非常方便,去年曾用Java模拟过一个,现整理出来。
本方法首先需要抓到屏幕的整个图象,将图象显示在一个JFrame中,再将JFrame全屏显示,这样就模拟出了一个桌面,Java也就可以获得鼠标的作用区域从而实现桌面中的小范围截屏。

import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionListener;/** * 用Java模拟出QQ桌面截图功能 */public class Test extends JFrame { private static final long serialVersionUID = -267804510087895906L; private JButton button = null; private JLabel imgLabel = null; public Test() { button = new JButton("模拟屏幕(点右键退出)"); button.addActionListener(new ActionListener() {  public void actionPerformed(ActionEvent e) {  try {   new ScreenWindow(imgLabel);  } catch (Exception e1) {   JOptionPane.showConfirmDialog(null, "出现意外错误!", "系统提示", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);  }  } }); JPanel pane = new JPanel(); pane.setBackground(Color.WHITE); imgLabel = new JLabel(); pane.add(imgLabel); JScrollPane spane = new JScrollPane(pane); this.getContentPane().add(button, BorderLayout.NORTH); this.getContentPane().add(spane); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(300, 200); this.setLocationRelativeTo(null); this.setVisible(true); } public static void main(String[] args) { new Test(); }}class ScreenWindow extends JFrame { private static final long serialVersionUID = -3758062802950480258L; private boolean isDrag = false; private int x = 0; private int y = 0; private int xEnd = 0; private int yEnd = 0; public ScreenWindow(final JLabel imgLabel) throws AWTException, InterruptedException { Dimension screenDims = Toolkit.getDefaultToolkit().getScreenSize(); JLabel label = new JLabel(new ImageIcon(ScreenImage.getScreenImage(0, 0, screenDims.width, screenDims.height))); label.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); label.addMouseListener(new MouseAdapter() {  public void mouseClicked(MouseEvent e) {  if (e.getButton() == MouseEvent.BUTTON3) {   dispose();  }  }  public void mousePressed(MouseEvent e) {  x = e.getX();  y = e.getY();  }  public void mouseReleased(MouseEvent e) {  if (isDrag) {   xEnd = e.getX();   yEnd = e.getY();   if(x > xEnd){   int temp = x;   x = xEnd;   xEnd = temp;   }   if(y > yEnd){   int temp = y;   y = yEnd;   yEnd = temp;   }   try {   imgLabel.setIcon(new ImageIcon(ScreenImage.getScreenImage(x, y, xEnd - x, yEnd - y)));   } catch (Exception ex) {   JOptionPane.showConfirmDialog(null, "出现意外错误!", "系统提示", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);   }   dispose();  }  } }); label.addMouseMotionListener(new MouseMotionListener() {  public void mouseDragged(MouseEvent e) {  if(!isDrag)   isDrag = true;  }  public void mouseMoved(MouseEvent e) {  /** 拖动过程的虚线选取框需自己实现 */  } }); this.setUndecorated(true); this.getContentPane().add(label); this.setSize(screenDims.width, screenDims.height); this.setVisible(true); this.setExtendedState(JFrame.MAXIMIZED_BOTH); }}class ScreenImage { public static Image getScreenImage(int x, int y, int w, int h) throws AWTException, InterruptedException { Robot robot = new Robot(); Image screen = robot.createScreenCapture(new Rectangle(x, y, w, h)).getScaledInstance(w, h, Image.SCALE_SMOOTH); MediaTracker tracker = new MediaTracker(new Label()); tracker.addImage(screen, 1); tracker.waitForID(0); return screen; }}

希望本文所述对大家的java程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表