如何在Java中获取窗口外的鼠标点击坐标

2022-09-01 16:27:01

我需要使用 Swing 实现一个类,当用户单击屏幕上的任意位置时,它可以获取鼠标坐标。如果我想在自己的窗口内获取鼠标坐标,我会使用 ,但我希望它即使在用户单击我的程序外部时也能正常工作。MouseListener

我希望我的类的行为就像KColorChooser一样:用户单击下拉按钮,他可以单击屏幕上的任意位置以获取该点的颜色。但我不知道使用纯Java是否可行。


答案 1

尽管有限,但有可能:

为焦点事件添加 AWTEventListener。只要你的应用在单击按钮之前具有焦点,你就会收到焦点丢失事件。然后查询指针位置。

当然,限制是你的应用会失去焦点。因此,根据您最终要实现的目标,这可能没有用。

如果您不想失去焦点,那么您将不得不暂时截取整个屏幕的屏幕截图,并将其显示在屏幕填充窗口中,该窗口像往常一样收听鼠标单击。

第一种方法的证明:

import java.awt.AWTEvent;
import java.awt.MouseInfo;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;

import javax.swing.JFrame;

public class Application1 {
    public static void main(String[] args) {
        Toolkit.getDefaultToolkit().addAWTEventListener(
          new Listener(), AWTEvent.MOUSE_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    private static class Listener implements AWTEventListener {
        public void eventDispatched(AWTEvent event) {
            System.out.print(MouseInfo.getPointerInfo().getLocation() + " | ");
            System.out.println(event);
        }
    }
}

在生成的应用程序外部单击:

java.awt.Point[x=198,y=59] | java.awt.event.MouseEvent[MOUSE_EXITED, ...
java.awt.Point[x=976,y=503] | java.awt.FocusEvent[FOCUS_LOST, ...

第二点在应用程序之外。


答案 2

忘了,还有另一种100%原生Java方法可以在OS X和Windows上使用它。GlassPane

Java在OS X上的Windows一支持半透明,Java现在也支持Windows上的Windows的半透明性(因为Java 1.6.0_10左右,需要检查)。

所以诀窍是:在点击“选择一种颜色”工具时,你创建了一个几乎透明的无边框Java窗口,覆盖整个屏幕。将其 alpha 设置为 10(alpha 从 0 变为 255)。这个alpha是如此之低,以至于用户不会注意到有一个非常薄的“几乎透明,但只有非常非常半透明”的无边框窗口覆盖整个屏幕。

现在,当用户单击覆盖整个屏幕的“Alpha设置为10个半透明无边框窗口”时,您将获得(x,y)。

丢弃无边框 Java 窗口。

使用 's,您就完成了。RobotgetRgb(x,y)

为什么要将 alpha 设置为 10 而不是 0?因为否则,Java不会拦截点击,而是直接进入操作系统(至少这是它在OS X上的工作方式)。有一个 treshold,我知道它没有设置为 “1”,也不是 “2”,而是大约 10 左右。

编辑我刚刚意识到你知道需要选择几种颜色,这更棘手,但仍然可以使用100%Java完成。您可以忍受“略微偏离”的颜色(受“近乎透明”的“不可见”图层的影响),或者在单击时必须删除该图层,获得正确的像素颜色,然后再次放置“近乎透明”的图层。现在,这当然是一个黑客,但它可以在100%Java中完成。


推荐