Java 为什么机器人鼠标点击赢了';当鼠标聚焦在全屏程序上时不工作?
我有一个程序,可以持续监控屏幕的中心像素。如果中心像素的颜色发生变化,它将使用Java 为什么机器人鼠标点击赢了';当鼠标聚焦在全屏程序上时不工作?,java,fullscreen,awtrobot,mouseclick-event,Java,Fullscreen,Awtrobot,Mouseclick Event,我有一个程序,可以持续监控屏幕的中心像素。如果中心像素的颜色发生变化,它将使用Robot类触发基本上是一次单击。我可以分别通过F9/F10打开/关闭它。当我运行程序时,它运行得非常好 我的问题是,当我运行程序并ALT+TAB到全屏程序(例如PC游戏)时,点击停止工作。知道为什么会这样吗 public class PixelBot implements NativeKeyListener{ private final Robot colorBot; private boolea
Robot
类触发基本上是一次单击。我可以分别通过F9/F10打开/关闭它。当我运行程序时,它运行得非常好
我的问题是,当我运行程序并ALT+TAB到全屏程序(例如PC游戏)时,点击停止工作。知道为什么会这样吗
public class PixelBot implements NativeKeyListener{
private final Robot colorBot;
private boolean running = true;
private int lastPixelValue = 0;
public static void main(String[] args) throws Exception {
GlobalScreen.registerNativeHook();
GlobalScreen.getInstance().addNativeKeyListener(new PixelBot());
}
public PixelBot() throws AWTException {
this.colorBot = new Robot();
this.runInBackground();
}
private void checkPixel() throws AWTException {
Rectangle areaOfInterest = getAreaOfInterest();
BufferedImage image = colorBot.createScreenCapture(areaOfInterest);
int clr = image.getRGB(0, 0);
if (clr != lastPixelValue) {
int red = (clr & 0x00ff0000) >> 16;
int green = (clr & 0x0000ff00) >> 8;
int blue = clr & 0x000000ff;
System.out.println("\nPixel color changed to: Red: " + red + ", Green: " + green + ", Blue: " + blue);
Toolkit.getDefaultToolkit().beep();
lastPixelValue = clr;
Robot robot = new Robot();
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
} else {
System.out.print(".");
}
}
private Rectangle getAreaOfInterest() {
// screen size may change:
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
// half of center of screen, minus 1 pixel to be captured:
int centerPointX = (int)(screenSize.getWidth() / 2 - 1);
int centerPointY = (int)(screenSize.getHeight() / 2 - 1);
Point centerOfScreenMinusOnePixel = new Point(centerPointX, centerPointY);
//System.out.println(centerPointX + " " + centerPointY);
return new Rectangle(centerOfScreenMinusOnePixel, new Dimension(1, 1));
}
private void runInBackground() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if(running){
try {
checkPixel();
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
public void stop() {
this.running = false;
}
public void start() {
this.running = true;
}
@Override
public void nativeKeyPressed(NativeKeyEvent e) {
// TODO Auto-generated method stub
System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
if(NativeKeyEvent.getKeyText(e.getKeyCode()).equals("F9")){
stop();
}
else if(NativeKeyEvent.getKeyText(e.getKeyCode()).equals("F10")){
start();
}
}
}
点击应该发生在游戏内部吗?理论上我认为它应该发生在任何地方,所以你已经调试过你的程序了吗?它是否检测到改变的像素?它能否成功模拟点击(没有被聚焦程序识别),或者是否存在异常?如果你的游戏处于窗口模式,你的游戏会得到模拟的鼠标点击吗?那么,你会在游戏上做更多的测试。也许这就像@jkeuhlen说的:问题在于游戏,而不是你的程序。顺便说一句:你不应该在按下鼠标键后立即释放它。有些程序可能需要一些时间(以我的经验,大约30到60毫秒)来注册鼠标点击。与@Tom所说的相同,如果你试图在游戏中使用鼠标点击来“作弊”,游戏可能有保护措施阻止你使用模拟鼠标。点击应该发生在游戏内部吗?理论上我认为应该发生在任何地方,所以你已经调试过你的程序了吗?它是否检测到改变的像素?它能否成功模拟点击(没有被聚焦程序识别),或者是否存在异常?如果你的游戏处于窗口模式,你的游戏会得到模拟的鼠标点击吗?那么,你会在游戏上做更多的测试。也许这就像@jkeuhlen说的:问题在于游戏,而不是你的程序。顺便说一句:你不应该在按下鼠标键后立即释放它。有些程序可能需要一些时间(以我的经验,大约30到60毫秒)来注册鼠标点击。与@Tom所说的相同,如果你试图在游戏中使用它来“作弊”,游戏可能会有保护措施阻止你使用模拟鼠标。