Я пытался захватить регион через трекер SWT, используя перетаскивание мышью, выполненное пользователем. Он отлично работает, когда я нахожусь на экране ноутбука, но я не вижу прямоугольника, нарисованного перетаскиванием мыши на экране ноутбука, когда внешний монитор подключен к моей ма c. Ниже приведен код того же.
package test.screen.capture;
import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tracker;
public class ScreenCapture {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(300, 200);
shell.setText("Screen Capture");
shell.setLayout(new RowLayout());
final Button button = new Button(shell, SWT.PUSH);
button.setText("Capture");
button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
new RegionSelector(new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println(o+""+arg);
}
});
}
public void widgetDefaultSelected(SelectionEvent event) {
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
/**
* class that allows user to select screen region to capture
*/
static class RegionSelector implements Runnable {
Shell shell;
Observer listener;
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
public RegionSelector(Observer listener) {
System.out.println("RegionSelector()");
this.listener = listener;
open();
}
void dispose() {
System.out.println("RegionSelector.dispose()");
if (scheduler != null) {
scheduler.shutdown();
scheduler = null;
}
if (shell != null) {
shell.dispose();
shell = null;
}
}
void open() {
System.out.println("RegionSelector.open()");
shell = new Shell(Display.getDefault(), SWT.NO_TRIM | SWT.ON_TOP);
shell.setSize(5, 5);
shell.addMouseMoveListener(
new MouseMoveListener() {
public void mouseMove(MouseEvent arg0) {
Point p = Display.getDefault().getCursorLocation();
shell.setLocation(p.x-2, p.y-2);
}
});
shell.addMouseListener(
new MouseAdapter() {
public void mouseDown(MouseEvent event) {
if (event.button == 1) {
dragRegion(Display.getDefault().getCursorLocation());
}
}});
Point p = Display.getDefault().getCursorLocation();
shell.setCursor(Display.getDefault().getSystemCursor(SWT.CURSOR_CROSS));
shell.setLocation(p.x-2, p.y-2);
shell.open();
//shell.forceActive();
// start cursor position tracker
scheduler.execute(this);
}
void dragRegion(Point p) {
System.out.println("RegionSelector.dragRegion(): start " + p);
Tracker tracker = new Tracker(Display.getDefault(), SWT.RESIZE);
tracker.setStippled(true);
Rectangle rectangle = new Rectangle(p.x, p.y, 1, 1);
tracker.setRectangles(new Rectangle[] { rectangle });
tracker.open(); // this is a synchronous call
listener.update(null, tracker.getRectangles()[0]);
tracker.dispose();
dispose();
}
@Override
public void run() {
Display.getDefault().syncExec(
new Runnable() {
@Override
public void run() {
if (shell == null || shell.isDisposed()) {
dispose();
} else {
Point p = Display.getDefault().getCursorLocation();
if (! shell.getBounds().contains(p)) {
shell.setLocation(p.x-2, p.y-2);
}
// reschedule cursor position tracker
scheduler.schedule(RegionSelector.this, 250L, TimeUnit.MILLISECONDS);
}
}
});
}
}
}
Любая подсказка по этому поводу будет полезна