Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Прослушивание событий курсора вне приложения Java

Мне нужно прослушивать события мыши вне моего приложения, а именно:
Нажатие левой клавиши мыши (получение координат нажатия) Отпускание левой клавиши мыши Передвижение мыши (с точки, в которой была нажата левая клавиша мыши)
Подскажите, при помощи чего это можно реализовать? Побегав по форумам я смог найти только действия в пределах приложения (окна программы), но мне нужно получать значения в любой программе, в которой произошло изменение.


Ответ

Если действовать можно только в пределах формы, то нужол сделать форму на весь экран(максимизхированную), но не fullScreen - контексты разные. Дале, нужно как отлавливать события мыши, так и транслировать их дале - сквозь форму.
Поиски навели меня на решение на awt: https://stackoverflow.com/questions/1190168/pass-mouse-events-to-applications-behind-from-a-java-ui
Далее - код из обсуждения по ссылке:
import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D;
import javax.swing.JFrame; import javax.swing.JPanel;
public class ClickThrough {
public static void main(String[] args) { JFrame.setDefaultLookAndFeelDecorated(true); JFrame f = new JFrame("Test"); f.setAlwaysOnTop(true); Component c = new JPanel() { @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g.create(); g2.setColor(Color.gray); int w = getWidth(); int h = getHeight(); g2.fillRect(0, 0, w,h); g2.setComposite(AlphaComposite.Clear); g2.fillRect(w/4, h/4, w-2*(w/4), h-2*(h/4)); } }; c.setPreferredSize(new Dimension(300, 300)); f.getContentPane().add(c); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); com.sun.awt.AWTUtilities.setWindowOpaque(f,false); }
}
И примечание оттуда же: нужно использовать недекорированное окно (без панели состояния, кнопок максимизации/минимизации и прочего), иначе не будет работать.
С JavaFX пока пробую повторить такое же. Получится - дополню ответ.

Комментариев нет:

Отправить комментарий