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

cd1*_*cd1 19 java mouse swing mouseclick-event

我需要使用Swing实现一个类,当用户点击屏幕上的任何位置时,可以获取鼠标坐标.如果我想在我自己的窗口中获取鼠标坐标,我会使用a MouseListener,但我希望它能够工作,即使用户点击我的程序外.

我希望我的课程表现得像KColorChooser:用户点击下拉按钮,他可以点击屏幕上的任意位置以获得该点的颜色.但我不知道是否可以使用纯Java.

小智 24

虽然有限,但可能:

为焦点事件添加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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

单击应用程序外部生成:

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, ...
Run Code Online (Sandbox Code Playgroud)

第二点是在应用程序之外.

  • 这实际上非常聪明,但它当然只会报告应用程序外的第一次点击,实际上会导致失去焦点.之后,除非应用程序再次重新获得焦点,否则不会报告任何其他点击.现在我想知道是否有可能对具有焦点请求的FOCUS_LOST事件作出反应......? (2认同)

Syn*_*r0r 21

忘记了GlassPane,还有另外100%的原生Java方法可以在OS X和Windows上运行.

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

所以诀窍是:在点击"选择一种颜色"工具后,您将创建一个覆盖整个屏幕的几乎透明的无边界Java窗口.您将其alpha设置为10(alpha从0到255).这个alpha值很低,用户不会注意到整个屏幕上有一个非常薄的"近乎透明但非常非常非常半透明"的无边框窗口.

现在,当用户点击覆盖整个屏幕的"alpha set to 10 translucent borderless window"时,你得到你的(x,y).

丢弃无边界Java窗口.

RobotgetRgb(x,y),你就大功告成了.

为什么将alpha设置为10而不是0?因为否则Java不会拦截点击,而是直接进入操作系统(至少它是如何在OS X上实现的).有一个门槛,我知道它没有设置为'1',也没有设置为'2',它大约是10左右.

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


小智 11

使用

import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;

PointerInfo inf = MouseInfo.getPointerInfo();
Point p = inf.getLocation();
Run Code Online (Sandbox Code Playgroud)

px和py将为您提供窗外的坐标.

  • 是的,但是当点击发生时它不会显示给你. (8认同)

cam*_*ckr 5

我不知道使用纯 Java 是否可行。

它不可能使用纯 Java,因为 Java 只知道 Windows 上属于 Java 的 MouseEvents。


sta*_*ker 5

这些事件被定向到具有焦点的窗口,从桌面上的所有事件你只能获得鼠标位置。

正如 Keilly 已经展示的那样,只能获取鼠标位置。

您需要包含本机库