-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDirectRobot.java
More file actions
260 lines (233 loc) · 8.18 KB
/
DirectRobot.java
File metadata and controls
260 lines (233 loc) · 8.18 KB
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
package com.company;
import java.awt.*;
import java.awt.peer.*;
import sun.awt.*;
import java.lang.reflect.*;
import java.net.*;
import java.io.*;
import java.util.*;
public final class DirectRobot
{
public DirectRobot() throws AWTException
{
this(null);
}
public DirectRobot(GraphicsDevice device) throws AWTException
{
if (device == null)
device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
this.device = device;
Toolkit toolkit = Toolkit.getDefaultToolkit();
peer = ((ComponentFactory) toolkit).createRobot(null, device);
Class<?> peerClass = peer.getClass();
Method method = null;
int methodType = -1;
Object methodParam = null;
try
{
method = peerClass.getDeclaredMethod("getRGBPixels", new Class<?>[] { Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, int[].class });
methodType = 0;
}
catch (Exception ex) { }
if (methodType < 0)
try
{
method = peerClass.getDeclaredMethod("getScreenPixels", new Class<?>[] { Rectangle.class, int[].class });
methodType = 1;
}
catch (Exception ex) { }
if (methodType < 0)
try
{
method = peerClass.getDeclaredMethod("getScreenPixels", new Class<?>[] { Integer.TYPE, Rectangle.class, int[].class });
methodType = 2;
GraphicsDevice[] devices = GraphicsEnvironment.getLocalGraphicsEnvironment().
getScreenDevices();
int count = devices.length;
for (int i = 0; i != count; ++i)
if (device.equals(devices[i]))
{
methodParam = Integer.valueOf(i);
break;
}
}
catch (Exception ex) { }
if (methodType < 0)
try
{
method = peerClass.getDeclaredMethod("getRGBPixelsImpl", new Class<?>[] { Class.forName("sun.awt.X11GraphicsConfig"), Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, int[].class });
methodType = 3;
Field field = peerClass.getDeclaredField("xgc");
try
{
field.setAccessible(true);
methodParam = field.get(peer);
}
finally
{
field.setAccessible(false);
}
}
catch (Exception ex) { }
if (methodType >= 0 && method != null && (methodType <= 1 || methodParam != null))
{
getRGBPixelsMethod = method;
getRGBPixelsMethodType = methodType;
getRGBPixelsMethodParam = methodParam;
}
else
{
System.out.println("WARNING: Failed to acquire direct method for grabbing pixels, please post this on the main thread!");
System.out.println();
System.out.println(peer.getClass().getName());
System.out.println();
try
{
Method[] methods = peer.getClass().getDeclaredMethods();
for (Method method1 : methods)
System.out.println(method1);
}
catch (Exception ex) { }
System.out.println();
}
}
public static GraphicsDevice getMouseInfo(Point point)
{
if (!hasMouseInfoPeer)
{
hasMouseInfoPeer = true;
try
{
Toolkit toolkit = Toolkit.getDefaultToolkit();
Method method = toolkit.getClass().getDeclaredMethod("getMouseInfoPeer", new Class<?>[0]);
try
{
method.setAccessible(true);
mouseInfoPeer = (MouseInfoPeer) method.invoke(toolkit, new Object[0]);
}
finally
{
method.setAccessible(false);
}
}
catch (Exception ex) { }
}
if (mouseInfoPeer != null)
{
int device = mouseInfoPeer.fillPointWithCoords(point != null ? point:new Point());
GraphicsDevice[] devices = GraphicsEnvironment.getLocalGraphicsEnvironment().
getScreenDevices();
return devices[device];
}
PointerInfo info = MouseInfo.getPointerInfo();
if (point != null)
{
Point location = info.getLocation();
point.x = location.x;
point.y = location.y;
}
return info.getDevice();
}
public static int getNumberOfMouseButtons()
{
return MouseInfo.getNumberOfButtons();
}
public static GraphicsDevice getDefaultScreenDevice()
{
return GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
}
public static GraphicsDevice getScreenDevice()
{
return getMouseInfo(null);
}
public void mouseMove(int x, int y)
{
peer.mouseMove(x, y);
}
public void mousePress(int buttons)
{
peer.mousePress(buttons);
}
public void mouseRelease(int buttons)
{
peer.mouseRelease(buttons);
}
public void mouseWheel(int wheelAmt)
{
peer.mouseWheel(wheelAmt);
}
public void keyPress(int keycode)
{
peer.keyPress(keycode);
}
public void keyRelease(int keycode)
{
peer.keyRelease(keycode);
}
public int getRGBPixel(int x, int y)
{
return peer.getRGBPixel(x, y);
}
public int[] getRGBPixels(Rectangle bounds)
{
return peer.getRGBPixels(bounds);
}
public boolean getRGBPixels(int x, int y, int width, int height, int[] pixels)
{
if (getRGBPixelsMethod != null)
try
{
if (getRGBPixelsMethodType == 0)
getRGBPixelsMethod.invoke(peer, new Object[] { Integer.valueOf(x), Integer.valueOf(y), Integer.valueOf(width), Integer.valueOf(height), pixels });
else if (getRGBPixelsMethodType == 1)
getRGBPixelsMethod.invoke(peer, new Object[] { new Rectangle(x, y, width, height), pixels });
else if (getRGBPixelsMethodType == 2)
getRGBPixelsMethod.invoke(peer, new Object[] { getRGBPixelsMethodParam, new Rectangle(x, y, width, height), pixels });
else
getRGBPixelsMethod.invoke(peer, new Object[] { getRGBPixelsMethodParam, Integer.valueOf(x), Integer.valueOf(y), Integer.valueOf(width), Integer.valueOf(height), pixels });
return true;
}
catch (Exception ex) { }
int[] tmp = getRGBPixels(new Rectangle(x, y, width, height));
System.arraycopy(tmp, 0, pixels, 0, width * height);
return false;
}
public void dispose()
{
getRGBPixelsMethodParam = null;
Method method = getRGBPixelsMethod;
if (method != null)
{
getRGBPixelsMethod = null;
try
{
method.setAccessible(false);
}
catch (Exception ex) { }
}
//Using reflection now because of some peers not having ANY support at all (1.5)
try
{
peer.getClass().getDeclaredMethod("dispose", new Class<?>[0]).invoke(peer, new Class<?>[0]);
}
catch (Exception ex) { }
}
protected void finalize() throws Throwable
{
try
{
dispose();
}
finally
{
super.finalize();
}
}
private Object getRGBPixelsMethodParam;
private int getRGBPixelsMethodType;
public final GraphicsDevice device;
private Method getRGBPixelsMethod;
private final RobotPeer peer;
private static boolean hasMouseInfoPeer;
private static MouseInfoPeer mouseInfoPeer;
}