抓取思路是首先抓到屏幕的整个图象,将图象显示在一个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桌面截图功能
- * @author 五斗米 <如转载请保留作者和出处>
- * @blog http://blog.csdn.net/mq612
- */
- 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;
- }
- }
来源: http://www.phpxs.com/code/1002540/