如何在Java中捕获鼠标光标?

时间:2014-01-18 16:52:33

标签: java awt mouse awtrobot

好的,你们大多数人都认为它是重复的,因为它已经写在各处,它不是真的可行,唯一的选择就是用awt机器人做截图。

但是......问题是鼠标光标甚至没有出现在AWT机器人生成的图片中......我尝试gnome-screeshots,在那里我可以看到鼠标光标。但是从java截图来看,什么都没有。整个图片,但不是鼠标光标。这就像它在拍照前隐藏它一样。我搜索像setIncludeMouseCursor这样的参数或类似的东西,但没有运气。

我可以捕获鼠标位置,这很好。但是,如果我只捕获这个区域,那么再没有光标。

知道如何强制执行robot.createScreenCapture以捕获鼠标光标吗?

2 个答案:

答案 0 :(得分:6)

您需要使用MouseInfo类并使用其方法static getPointerInfo()来获取Pointer对象来表示光标在屏幕上的位置。

获得该职位后,您可以使用Robot将屏幕截图设为BufferedImage并在其上绘制光标。简单!

SSCCE

package stack;

import java.awt.AWTException;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.MouseInfo;
import java.awt.PointerInfo;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class GetMousePointer {
    public static void main(String[] args) {
        final String USER_HOME = System.getProperty("user.home");

        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        int width = gd.getDisplayMode().getWidth();
        int height = gd.getDisplayMode().getHeight();

        BufferedImage blackSquare = new BufferedImage(50, 50, BufferedImage.TYPE_3BYTE_BGR);
        for(int i = 0; i < blackSquare.getHeight(); i++){
            for(int j = 0; j < blackSquare.getWidth(); j++){
                blackSquare.setRGB(j, i, 128);
            }
        }


        try {
            Robot robot = new Robot();
            BufferedImage screenshot = robot.createScreenCapture(new Rectangle(0,0,width,height));
            PointerInfo pointer = MouseInfo.getPointerInfo();
            int x = (int) pointer.getLocation().getX();
            int y = (int) pointer.getLocation().getY();

            screenshot.getGraphics().drawImage(blackSquare, x, y, null);
            ImageIO.write(screenshot, "PNG", new File(USER_HOME, "screenshot.PNG"));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}  

<强>输出
enter image description here

蓝色方块的左上角是我光标的位置。

答案 1 :(得分:1)

你可以扩展Robot并覆盖createScreenCapture到(给定光标位置)绘制捕获光标。

这样的事情:

@Override
public BufferedImage createScreenCapture(){
    BufferedImage img = Super.createScreenCapture();
    return drawCursor(x,y,img); 
}

Obvioulsy drawCursor会返回BufferedImage