Определить, нажата ли какая-либо кнопка мыши, и если да, то какая?
По сути, я хочу узнать, нажата ли какая-либо кнопка мыши, и если да, то какая. Проблема в том, что я не использую (постоянно сфокусированную) среду пользовательского интерфейса. Он предназначен для работы в фоновом режиме, пока ОС сосредоточена на другом окне. У меня просто настроен графический интерфейс Swing для удобного управления.
Как я мог это сделать?
(Кстати, я пытаюсь запросить его внутри цикла, поэтому настройка прослушивателя событий будет неэффективной.)
1 ответ
Как упоминалось другими, вам нужно будет использовать JNA, чтобы подключиться к собственным API операционной системы. К счастью для вас, есть отличная библиотека, которая делает именно это jnativehook .
Вот некоторый демонстрационный код, который создает глобальный прослушиватель мыши :
import GlobalScreen;
import NativeHookException;
import NativeMouseEvent;
import NativeMouseInputListener;
public class GlobalMouseListenerExample implements NativeMouseInputListener {
public void nativeMouseClicked(NativeMouseEvent e) {
System.out.println("Mouse Clicked: " + e.getClickCount());
}
public void nativeMousePressed(NativeMouseEvent e) {
System.out.println("Mouse Pressed: " + e.getButton());
}
public void nativeMouseReleased(NativeMouseEvent e) {
System.out.println("Mouse Released: " + e.getButton());
}
public void nativeMouseMoved(NativeMouseEvent e) {
System.out.println("Mouse Moved: " + e.getX() + ", " + e.getY());
}
public void nativeMouseDragged(NativeMouseEvent e) {
System.out.println("Mouse Dragged: " + e.getX() + ", " + e.getY());
}
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook();
}
catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
System.exit(1);
}
// Construct the example object.
GlobalMouseListenerExample example = new GlobalMouseListenerExample();
// Add the appropriate listeners.
GlobalScreen.addNativeMouseListener(example);
GlobalScreen.addNativeMouseMotionListener(example);
}
}
Также не забудьте прочитать о безопасности потоков при работе с Swing с использованием упомянутой библиотеки.