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