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

如何在Java中捕获鼠标光标?,java,awt,mouse,awtrobot,Java,Awt,Mouse,Awtrobot,好的,你们大多数人会认为这是一个复制品,因为它已经被写在了所有地方,它不是真正可行的,唯一的选择是使用awt机器人做一个屏幕截图 但是。。。问题是,鼠标光标甚至没有出现在AWT机器人制作的图片中。。。我尝试gnome屏幕快照,在那里我可以看到鼠标光标。但是从java截图上看,什么都没有。整个图片,但不是鼠标光标。就像是在拍照前把它藏起来。我搜索像SetIncludeUseCursor之类的参数,但运气不好 我可以捕捉鼠标的位置,这很好。但是如果我只捕捉这个区域,同样没有光标 知道如何强制robo

好的,你们大多数人会认为这是一个复制品,因为它已经被写在了所有地方,它不是真正可行的,唯一的选择是使用awt机器人做一个屏幕截图

但是。。。问题是,鼠标光标甚至没有出现在AWT机器人制作的图片中。。。我尝试gnome屏幕快照,在那里我可以看到鼠标光标。但是从java截图上看,什么都没有。整个图片,但不是鼠标光标。就像是在拍照前把它藏起来。我搜索像SetIncludeUseCursor之类的参数,但运气不好

我可以捕捉鼠标的位置,这很好。但是如果我只捕捉这个区域,同样没有光标


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

您可以扩展
robot
并覆盖
createScreenCapture
,以(给定光标位置)在捕获中绘制光标

大概是这样的:

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

显然
drawCursor
返回一个
BuffereImage

您可以扩展
Robot
并覆盖
CreateScreateScreenCapture
,以(给定光标位置)在捕获中绘制光标

大概是这样的:

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

显然
drawCursor
返回一个
buffereImage

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

获得位置后,您可以使用
Robot
将屏幕截图作为
buffereImage
并在其上绘制光标。简单

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();
        }
    }
}  
包栈;
导入java.awt.AWTException;
导入java.awt.GraphicsDevice;
导入java.awt.GraphicsEnvironment;
导入java.awt.MouseInfo;
导入java.awt.PointerInfo;
导入java.awt.Rectangle;
导入java.awt.Robot;
导入java.awt.image.buffereImage;
导入java.io.File;
导入javax.imageio.imageio;
公共类GetMousePointer{
公共静态void main(字符串[]args){
最终字符串USER_HOME=System.getProperty(“USER.HOME”);
GraphicsDevice gd=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
int width=gd.getDisplayMode().getWidth();
int height=gd.getDisplayMode().getHeight();
BuffereImage blackSquare=新的BuffereImage(50,50,BuffereImage.TYPE_3BYTE_BGR);
对于(int i=0;i
输出


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

您需要使用
MouseInfo
类,并使用其方法static
getPointerInfo()
获取一个
指针
对象,以表示光标在屏幕上的位置

获得位置后,您可以使用
Robot
将屏幕截图作为
buffereImage
并在其上绘制光标。简单

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();
        }
    }
}  
包栈;
导入java.awt.AWTException;
导入java.awt.GraphicsDevice;
导入java.awt.GraphicsEnvironment;
导入java.awt.MouseInfo;
导入java.awt.PointerInfo;
导入java.awt.Rectangle;
导入java.awt.Robot;
导入java.awt.image.buffereImage;
导入java.io.File;
导入javax.imageio.imageio;
公共类GetMousePointer{
公共静态void main(字符串[]args){
最终字符串USER_HOME=System.getProperty(“USER.HOME”);
GraphicsDevice gd=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
int width=gd.getDisplayMode().getWidth();
int height=gd.getDisplayMode().getHeight();
BuffereImage blackSquare=新的BuffereImage(50,50,BuffereImage.TYPE_3BYTE_BGR);
对于(int i=0;i
输出


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

好吧,见鬼!我本来打算这么说的。但既然你不仅说了,还提供了代码+1:)@andrewhompson你不能控制meee!!问题是,我想要的是光标图片。我想知道它是箭头还是双箭头等。我需要根据光标的形式采取行动:(@jmspaggi我不相信你可以用纯Java获得这些信息。你需要一个较低级别的API通过JNI/JNA与你的Java程序进行接口。好吧,见鬼!我想说的是。但是既然你不仅说了,而且还提供了代码..+1:)@andrewhompson你不能用troll meee!!XD问题是,我想要什么