Можно ли заставить MouseMotionListener прослушивать все системные события движения мыши? - PullRequest
5 голосов
/ 02 февраля 2009

Мой стандартный слушатель:

class MyMouseMotionListener implements MouseMotionListener {
public void mouseDragged(MouseEvent e) {
    System.out.println("Dragged...");
}

public void mouseMoved(MouseEvent e) {
    System.out.println("Moved...");
}}

Достаточно просто, но к чему мне его добавить, чтобы слушать общесистемные события? Я исследовал такие вещи, как подклассы GraphicsDevice и AccessibleContext - они не предлагают добавления MouseMotionListeners напрямую, но я надеялся, что они могут дать мне некоторое представление о том, как я мог бы реализовать это.

Редактировать: Это совсем не на основе событий, но я нашел это:

MouseInfo.getPointerInfo().getLocation()

Фактически возвращает позицию мыши вне контекста моего приложения, даже если само приложение не имеет фокуса. Есть ли способ наблюдать это и отправлять событие, если его значение изменилось?

Ответы [ 5 ]

5 голосов
/ 02 февраля 2009

Вы можете подписаться на все события мыши в вашей иерархии контейнера Java, используя Toolkit.addAWTEventListener(AWTEventListener listener, long eventMask). Параметр eventMask определяет, какие события получит слушатель.

Итак, ваш код будет выглядеть примерно так:

Toolkit.getDefaultToolkit().addAWTEventListener(new MyMouseMotionListener(), <a href="http://docs.oracle.com/javase/8/docs/api/java/awt/AWTEvent.html#MOUSE_MOTION_EVENT_MASK" rel="nofollow noreferrer">AWTEvent.MOUSE_MOTION_EVENT_MASK</a>);

3 голосов
/ 02 февраля 2009

ОБНОВЛЕНИЕ: Вы можете опросить MouseInfo для определения позиции, но вы никогда не получите состояние кнопки. Вам нужно будет использовать собственный код для получения состояния кнопки.

Я не думаю, что есть какой-либо способ без использования собственного кода для прослушивания курсора мыши вне иерархии cotainer вашего приложения.

2 голосов
/ 20 июля 2012

Я решил ту же проблему, используя вышеупомянутую возможность получить позицию мыши по запросу. Затем я запустил новый поток, чтобы делать это постоянно во время выполнения остальных программ.

MouseInfo.getPointerInfo (). GetLocation ()

Также мне пришлось сделать основной класс расширенным Thread, таким образом

public class MouseMotion extends Thread {

Это требует, чтобы вы создали функцию run. В вашей функции void просто создайте бесконечный цикл

public void run() {
int n=10;
for (int i=0;i<n; n++) //horrible infinite loop
{
    Thread.sleep(100); //this will slow the capture rate to 0.1 seconds
    PointerInfo a = MouseInfo.getPointerInfo();
    Point p = new Point (0,0);
    a = MouseInfo.getPointerInfo();
    p = a.getLocation();
    int x = (int)p.getX(); //getX and getY return doubles so typecast
    int y = (int)p.getY();
    System.out.println(""+x+"   "+y);   //to see it grabing locations not needed
}
}

Теперь осталось только вызвать нить, когда вы начнете наблюдать за движением мыши. Я запускаю тему сразу после основного как такового

public static main (String[] args) throws Exception {
Thread thread = new MouseMotion();
thread.start();
...}
0 голосов
/ 17 декабря 2012

Для этого есть несколько библиотек, одну из которых я регулярно использую для приложений.

JNativeHook обладает исключительной способностью обрабатывать события как мыши, так и клавиатуры. (Google, я слишком ленив, чтобы перейти к Subversion. Хотя вы можете просто скачать библиотеку, и она работает так же, как обычное событие мыши после двух вызовов библиотеки.

Я бы хотел, чтобы, когда я занимался серфингом в Google, кто-нибудь разместил бы эту библиотеку в такой теме. Я все время использую stackoverflow, но я не зарегистрированный участник, потому что я никогда не обращаюсь за помощью публично.

0 голосов
/ 02 февраля 2009

Если вы хотите прослушивать / захватывать все события мыши в системе (например, не только в окне вашего приложения), вам потребуется ловушка мыши .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...