захват Java-мыши - PullRequest
       29

захват Java-мыши

3 голосов
/ 26 августа 2010

Как мне захватить мышь в приложении Java, чтобы приложение Java видело все события мыши (даже те, которые происходят, если мышь перемещается за пределы окна приложения)? Это похоже на функцию SetCapture в Windows.

Ответы [ 4 ]

3 голосов
/ 26 августа 2010

Вы не; JVM, или, более конкретно, AWT, генерирует входные события только тогда, когда Windows отправляет ей входные события, а JVM регистрирует только те события, которые происходят в его окне.

Возможно, вам удастся осуществить это с помощью JNI, но с другой стороны вы не сможете - это будет зависеть от того, сможете ли вы получить информацию, требуемую базовым API. Поскольку это скорее всего дескриптор окна, у вас не будет того, что нужно для вызова API, даже из JNI.

1 голос
/ 03 ноября 2012

Вы должны подключить мышь на уровне операционной системы. Windows (Swing, AWT, MFC и т. Д.) Знают только о движениях мыши в пределах их границ. Если вам нужен способ доступа к текущей позиции мыши, независимо от того, где мышь находится на экране, вам нужно написать Input Hook: Input Hooks . Затем вы можете использовать JNI или прочитать STDOUT из консольного приложения win32, предназначенного для использования Хука ввода для пересылки событий / позиций мыши в ваш код Java. Я использую последний метод в некоторых из моих тестов пользовательского интерфейса с успехом.

0 голосов
/ 04 ноября 2016

Просто используйте библиотеку системных перехватчиков, доступную на gitHub https://github.com/kristian/system-hook

Это относится только к системам на базе Windows, но очень просто реализовать.

Пример использования

import lc.kra.system.keyboard.GlobalKeyboardHook;
import lc.kra.system.keyboard.event.GlobalKeyAdapter;
import lc.kra.system.keyboard.event.GlobalKeyEvent;

public class GlobalKeyboardExample {
    private static boolean run = true;
    public static void main(String[] args) {
        // might throw a UnsatisfiedLinkError if the native library fails to load or a RuntimeException if hooking fails 
        GlobalKeyboardHook keyboardHook = new GlobalKeyboardHook();

        System.out.println("Global keyboard hook successfully started, press [escape] key to shutdown.");
        keyboardHook.addKeyListener(new GlobalKeyAdapter() {
            @Override public void keyPressed(GlobalKeyEvent event) {
                System.out.println(event);
                if(event.getVirtualKeyCode()==GlobalKeyEvent.VK_ESCAPE)
                    run = false;
            }
            @Override public void keyReleased(GlobalKeyEvent event) {
                System.out.println(event); }
        });

        try {
            while(run) Thread.sleep(128);
        } catch(InterruptedException e) { /* nothing to do here */ }
          finally { keyboardHook.shutdownHook(); }
    }
}
0 голосов
/ 14 февраля 2013

Мне тоже нужно было это сделать!

Я после поиска в Интернете обнаружил, что можно использовать moveMouse в java.awt.Robot.

В основном используйте робота, чтобы переместить мышь в центр кадра.Если пользователь перемещает это: проверьте, сколько и переместите это назад к центру.

Для этого не требуются дополнительные пакеты или JNI (моя демонстрация использует JOGL и vecmath, но это для графики).Это достаточно хорошо?Попробуйте демо, вот здесь:

http://www.eit.se/hb/misc/java/examples/FirstPersonJavaProtoGame/

Если приведенное выше решение недостаточно хорошо, возможно, вам нужен lwjgl:

http://www.lwjgl.org/javadoc/org/lwjgl/input/Mouse.html

/ Хенрик Бьёркман

...