本文实例讲述了Java模拟QQ桌面截图功能实现方法。分享给大家供大家参考。具体如下:
QQ的桌面截图功能非常方便,去年曾用Java模拟过一个,现整理出来。
本方法首先需要抓到屏幕的整个图象,将图象显示在一个JFrame中,再将JFrame全屏显示,这样就模拟出了一个桌面,Java也就可以获得鼠标的作用区域从而实现桌面中的小范围截屏。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
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程序设计有所帮助。