I am looking for a way to capture or capture a mouse in a window after it has entered this window, similar to how the mouse entered the virtual machine window until the user press CTRL + ALT + DEL or release the mouse in some other way. How to do it in Java? Switching to full screen is not an option.
EDIT:
Here are some SSCCEs for ya. This code will mask your mouse in the window. To exit, you only need to generate a frame and go directly to the close button. If you notice when your mouse tries to leave, it will automatically return to (0,0). I need to know how to make him return to the coordinates where he came from. I tried getX () and getY () instead of (0,0), but the robot does not return the mouse there (I think the response time should slow down). I also had a robot that takes the mouse back to crosshair.x and crosshair.y, but this one (like the others) still allows the mouse to exit if the user clicks at the right time. Any suggestions?
Main class:
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferStrategy;
import java.awt.image.MemoryImageSource;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import javax.swing.JFrame;
public class Game extends JFrame implements MouseMotionListener, MouseListener{
private int windowWidth = 640;
private int windowHeight = 480;
private Crosshair crosshair;
public static void main(String[] args) {
new Game();
}
public Game() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(windowWidth, windowHeight);
this.setResizable(false);
this.setLocation(0,0);
this.setVisible(true);
this.createBufferStrategy(2);
addMouseMotionListener(this);
addMouseListener(this);
initGame();
while(true) {
long start = System.currentTimeMillis();
gameLoop();
while(System.currentTimeMillis()-start < 5) {
}
}
}
private void initGame() {
hideCursor();
crosshair = new Crosshair (windowWidth/2, windowHeight/2);
}
private void gameLoop() {
drawFrame();
}
private void drawFrame() {
BufferStrategy bf = this.getBufferStrategy();
Graphics g = (Graphics)bf.getDrawGraphics();
try {
g = bf.getDrawGraphics();
Color darkBlue = new Color(0x010040);
g.setColor(darkBlue);
g.fillRect(0, 0, windowWidth, windowHeight);
drawCrossHair(g);
} finally {
g.dispose();
}
bf.show();
Toolkit.getDefaultToolkit().sync();
}
private void drawCrossHair(Graphics g){
Color yellow = new Color (0xEDFF62);
g.setColor(yellow);
g.drawOval(crosshair.x, crosshair.y, 40, 40);
g.fillArc(crosshair.x + 10, crosshair.y + 21 , 20, 20, -45, -90);
g.fillArc(crosshair.x - 1, crosshair.y + 10, 20, 20, -135, -90);
g.fillArc(crosshair.x + 10, crosshair.y - 1, 20, 20, -225, -90);
g.fillArc(crosshair.x + 21, crosshair.y + 10, 20, 20, -315, -90);
}
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
crosshair.x = e.getX();
crosshair.y = e.getY();
}
private void hideCursor() {
int[] pixels = new int[16 * 16];
Image image = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(16, 16, pixels, 0, 16));
Cursor transparentCursor = Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "invisiblecursor");
getContentPane().setCursor(transparentCursor);
}
public void mouseExited(MouseEvent e) {
System.out.println("Event: " + e);
try {
Robot robot = new Robot();
robot.mouseMove(0, 0);
}
catch (AWTException ex) {
ex.printStackTrace();
}
}
public void mouseEntered(MouseEvent e){
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
}
Another class:
public class Crosshair{
public int x;
public int y;
public Crosshair(int x, int y) {
this.x = x;
this.y = y;
}
}