Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to obtain mouse click coordinates outside my window in Java

I need to implement a class, using Swing, which can obtain the mouse coordinates when the user clicks anywhere on the screen. if I wanted to obtain the mouse coordinates inside my own window, I'd use a MouseListener, but I want it to work even when the user clicks outside my program.

I want my class to behave just like KColorChooser: the user clicks on the drop button and he can click anywhere on the screen to obtain the color of that spot. but I don't know if that's possible using pure Java.

like image 428
cd1 Avatar asked Mar 10 '10 18:03

cd1


3 Answers

It is possible though limited:

Add an AWTEventListener for focus events. As long as your app has focus before the button is clicked you'll receive a focus lost event. Then query for the pointer position.

The limitation is that, of course, your app loses focus. So depending on what you are ultimately trying to achieve this might not be useful.

If you don't want to lose focus then you will have to temporarily take a screenshot of the whole screen and display that in a screen filling window which listens for a mouse click as usual.

Proof of first method:

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);         }     } } 

Clicking outside of the app produced:

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, ... 

The second point is outside of the app.

like image 68
Keilly Avatar answered Sep 25 '22 02:09

Keilly


Forget about GlassPane, there's another 100% native Java way to do it that works both on OS X and on Windows.

Java has always supported translucency for its windows on OS X and Java now supports translucency for its windows on Windows too (since Java 1.6.0_10 or so, needs to be checked).

So the trick is: upon clicking on the "pick a color" tool, you create a nearly transparent borderless Java window covering the entire screen. You set its alpha to 10 (alpha goes from 0 to 255). That alpha is so low the user won't notice that there's a very thin "nearly transparent but only very very very translucent" borderless window covering the entire screen.

Now when the user clicks on your "alpha set to 10 translucent borderless window" covering the entire screen, you get your (x,y).

Discard the borderless Java window.

Use Robot's getRgb(x,y) and you're done.

Why set the alpha to 10 and not 0? Because otherwise clicks aren't intercepted by Java but go directly to the OS (at least that's how it works for a fact on OS X). There's a treshold and I know it's not set at '1', nor '2', it's around 10 or so.

EDIT I just realized you know need to pick several colors, this is trickier but can still be done using 100% Java. Either you can live with "slightly off" colors (affected by the "nearly transparent" 'invisible' layer) or upon getting a click you must remove the layer, get the correct pixel color, and put again a "nearly transparent" layer. Now of course that is one heck of a hack but it can be done in 100% Java.

like image 22
SyntaxT3rr0r Avatar answered Sep 26 '22 02:09

SyntaxT3rr0r


Use

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

PointerInfo inf = MouseInfo.getPointerInfo();
Point p = inf.getLocation();

p.x and p.y will give you co-ordinates outside your window.

like image 38
Chris Avatar answered Sep 23 '22 02:09

Chris