X

Прозрачность окон для курсора в Java

Сегодня увидел на хабре эту статью: Окна «неправильной» формы, Java 6 & 7 ed и вспомнил, что месяца три назад, я игрался с захватом изображения с экрана и столкнулся с задачей, сделать "прозрачное окно" для курсора, т.е. чтобы я мог, например, нажать на ссылку расположенную под "окном захвата".

Окно захвата должно было представлять из себя прямоугольник двигающийся повсюду за курсором мыши.

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

Выглядит это так:

Как видите, черный прямоугольник справа, это область захвата, она двигается за курсором. И что самое главное - мышка работает без проблем. На скриншоте видно, что ссылка стала активной.

Как же такое реализовать, если отрисовка на десктопе невозможна, и передача клика под окно тоже?

Как говорится, "голь на выдумки хитра", поэтому с моими небольшими знаниями Java, я сделал так: каждая рамка (всего их 4-е) представляет из себя 2х пиксельный JFrame, т.е. я создал дополнительно 4е окна, убрал у них контролы и покрасил в черный цвет. А дальше осталось их только объединить в один класс для удобства. Такой вот я изобрел костыль:

class drawBorderOnDesktop {
 public JWindow topLine;
 public JWindow bottomLine;
 public JWindow leftLine;
 public JWindow rightLine;
 drawBorderOnDesktop(int x, int y, int w, int h) {
  topLine = new JWindow();
  topLine.setBounds(x,y,w-x,1);
  topLine.getContentPane().setBackground(Color.BLACK);
  topLine.setVisible(true);
  topLine.setAlwaysOnTop(true);

  bottomLine = new JWindow();
  bottomLine.setBounds(x,h,w-x,1);
  bottomLine.getContentPane().setBackground(Color.BLACK);
  bottomLine.setVisible(true);
  bottomLine.setAlwaysOnTop(true);

  leftLine = new JWindow();
  leftLine.setBounds(x,y,1,h-y);
  leftLine.getContentPane().setBackground(Color.BLACK);
  leftLine.setVisible(true);
  leftLine.setAlwaysOnTop(true);

  rightLine = new JWindow();
  rightLine.setBounds(w,y,1,h-y);
  rightLine.getContentPane().setBackground(Color.BLACK);
  rightLine.setVisible(true);
  rightLine.setAlwaysOnTop(true);

 }

 public void setPosition(int x, int y, int w, int h) {

  topLine.setBounds(x,y,w-x,Config.captureBorder);
  topLine.setLocation(x, y);

  bottomLine.setBounds(x,h,w-x,Config.captureBorder);
  bottomLine.setLocation(x, h);

  leftLine.setBounds(x,y,Config.captureBorder,h-y);
  leftLine.setLocation(x, y);

  rightLine.setBounds(w,y,Config.captureBorder,h-y+Config.captureBorder);
  rightLine.setLocation(w, y);

 }

}

Я не претендую на Премию Тьюринга, но возможно, этот способ так же кому-то пригодится.

Полный код софтинки со скриншота тут: ScreenZoom

Категории: Java Java labs