package org.ironbrain.client;
import com.sun.awt.AWTUtilities;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.util.function.Consumer;
public class ScreenCapture extends JFrame implements MouseMotionListener, MouseListener {
private int mX, mY;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Robot robot;
BufferedImage rawImage;
Rectangle selectRec = new Rectangle(-1, -1, -1, -1);
Consumer<BufferedImage> onGet;
public ScreenCapture(Consumer<BufferedImage> onGet) {
this.onGet = onGet;
try {
robot = new Robot();
setUndecorated(true);
setExtendedState(JFrame.MAXIMIZED_BOTH);
AWTUtilities.setWindowOpaque(this, false);
addMouseMotionListener(this);
setAlwaysOnTop(true);
new Timer(10, event -> onGlobalMouseMove()).start();
hideCursor();
rawImage = robot.createScreenCapture(new Rectangle(0, 0, screenSize.width, screenSize.height));
addMouseListener(this);
} catch (AWTException e) {
e.printStackTrace();
}
}
@Override
public void mouseDragged(MouseEvent e) {
//Not used
}
@Override
public void mouseMoved(MouseEvent e) {
//Not used
}
public void onGlobalMouseMove() {
mX = MouseInfo.getPointerInfo().getLocation().x;
mY = MouseInfo.getPointerInfo().getLocation().y;
repaint();
}
public void paint(Graphics g) {
super.paint(g);
//Draw screen copy
g.drawImage(rawImage, 0, 0, null);
//Draw cross lines
g.setColor(Color.BLUE);
g.drawLine(mX, 0, mX, screenSize.height);
g.drawLine(0, mY, screenSize.width, mY);
//Draw rect
g.setColor(Color.BLACK);
if (selectRec.getX() != -1) {
int x, y;
if (mX < selectRec.getX()) {
x = mX;
} else {
x = (int) selectRec.getX();
}
if (mY < selectRec.getY()) {
y = mY;
} else {
y = (int) selectRec.getY();
}
g.drawRect(x, y, Math.abs(mX - (int) selectRec.getX()), Math.abs(mY - (int) selectRec.getY()));
}
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
//Left click - exit
if (e.getButton() == MouseEvent.BUTTON3) {
setVisible(false);
dispose();
}
if (e.getButton() == MouseEvent.BUTTON1) {
selectRec.setLocation(mX, mY);
}
}
@Override
public void mouseReleased(MouseEvent e) {
int height = Math.abs(mY - (int) selectRec.getY());
int width = Math.abs(mX - (int) selectRec.getX());
//Select left x and left y
int lX;
if (mX > selectRec.x) {
lX = selectRec.x;
} else {
lX = mX;
}
int lY;
if (mY > selectRec.y) {
lY = selectRec.y;
} else {
lY = mY;
}
BufferedImage image = rawImage.getSubimage(lX, lY, width, height);
onGet.accept(image);
setVisible(false);
dispose();
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
public void hideCursor() {
BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(
cursorImg, new Point(0, 0), "blank cursor");
setCursor(blankCursor);
}
}