【问题标题】:How to capture mouse cursor in Java?如何在Java中捕获鼠标光标?
【发布时间】:2014-02-08 00:40:36
【问题描述】:

好吧,你们中的大多数人会认为它是重复的,因为它已经到处都写着它不是真正可行的,唯一的选择是使用 awt 机器人进行屏幕截图。

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

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

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

【问题讨论】:

    标签: java awt mouse awtrobot


    【解决方案1】:

    您需要使用MouseInfo 类并使用其方法静态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();
            }
        }
    }  
    

    输出

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

    【讨论】:

    • 哎呀!我正要这么说。但是既然你不仅说了,还提供了代码.. +1 :)
    • @AndrewThompson 你不能喷我!! xD
    • 问题是,我想要的是光标图片。我想知道它是箭头还是双箭头等。我需要根据光标的形式采取行动:(
    • @jmspaggi 我不相信你可以用纯 Java 获得这些信息。您将需要一个较低级别的 API 来通过 JNI / JNA 与您的 Java 程序交互。
    【解决方案2】:

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

    类似这样的:

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

    显然drawCursor 返回一个BufferedImage

    【讨论】:

    • 不幸的是,它与上面的评论相同。我需要光标图片。不仅仅是光标所在的图片:(
    猜你喜欢
    • 2011-01-29
    • 2023-03-30
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多