Я ищу способ захвата или захвата мыши в окне после того, как оно вошло в это окно, так же, как мышь попадает в окно виртуальной машины, пока пользователь не нажмет CTRL + ALT + DEL или не отпустит мышь в каком-либо окне. другой способ. Как я могу сделать это в Java? Переход на полный экран не возможен.
EDIT:
Вот немного SSCCE для тебя. Этот код будет ловить вашу мышь в окне. Чтобы выйти, вам нужно просто сгенерировать кадр и перейти непосредственно к кнопке закрытия. Если вы заметите, когда ваша мышь пытается выйти, она автоматически вернется к (0,0). Что мне нужно знать, так это как заставить его вернуться к координатам, откуда он вышел. Я пробовал getX () и getY () вместо (0,0), но робот там не возвращает мышь (я думаю, что время отклика слишком медленное). Я также заставил робота переместить мышь обратно в crosshair.x и crosshair.y, но это (как и другие) по-прежнему позволяет мыши убежать, если пользователь щелкнет в нужный момент. Какие-нибудь мысли?
Основной класс:
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) {
//empty while loop
}
}
}
private void initGame() {
hideCursor();
crosshair = new Crosshair (windowWidth/2, windowHeight/2);
}
private void gameLoop() {
//game logic
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) {
//empty method
}
@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);// When I use (getX(),getY()) instead of (0,0) the robot will not move the mouse at all even though getX() and getY() are the coordinates I want the mouse to be moved to. Also the mouse can still escape, even when crosshair.x and crosshair.y are used as the coordinates. It seems that robot is too slow.
}
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) {
}
}
Другой класс:
public class Crosshair{
public int x;
public int y;
public Crosshair(int x, int y) {
this.x = x;
this.y = y;
}
}