Как перехватить клик, чтобы он не произошел в windows? JNA Java

111
30 января 2021, 08:00

Я пытаюсь сделать пипетку на Java. Изначально сделал таким образом: При запуске jar делался скриншот экрана и рисовался на фуллскрин прозрачном jframe, после чего по клику в любой пиксель забирался хекс его цвета в буфер обмена, так же создавался 200х200 бмп квадрат с этим цветом и с названием хекса отображался в папке, фрейм закрывался и соответственно завершался процесс.

После чего узнал про JNA и попробовал адаптировать по изначальной задумке, чтобы процесс висел в трее, по сочетанию клавиш подключался mouseListener и по щелчку выполнив предыдущий стек процесс переходил обратно в режим ожидания хоткея, только теперь уже вне jframe, в самом windows. Это реализовать удалось.

Проблема заключается в том, что не могу понять, как перехватить клик таким образом, чтобы он блокировался сочетанием клавиш, чтобы при клике не происходило взаимодействий с самой ОС, была возможность взять цвет, к примеру, из кнопки exit

 package com.colorDropper;
import org.jnativehook.GlobalScreen;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
import org.jnativehook.mouse.NativeMouseEvent;
import org.jnativehook.mouse.NativeMouseListener;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class GlobalListener implements NativeKeyListener {
    private boolean mouseListenerIsActive;
    private boolean ctrlIsPressed = false;
    public void nativeKeyPressed(NativeKeyEvent e) {
        if (e.getKeyCode() == NativeKeyEvent.VC_CONTROL_L){
            ctrlIsPressedNow();
        }
        if (e.getKeyCode() == NativeKeyEvent.VC_Q) {
            if (ctrlIsPressed) {
                doSmthWithMouseListeners();
                GlobalScreen.addNativeMouseListener(new NativeMouseListener() {
                    @Override
                    public void nativeMousePressed(NativeMouseEvent nativeMouseEvent) {
                        if (mouseListenerIsActive) {
                            try {
                                Robot robot = new Robot();
                                Color colors = robot.getPixelColor(MouseInfo.getPointerInfo().getLocation().x, MouseInfo.getPointerInfo().getLocation().y);
                                int r = colors.getRed();
                                int g = colors.getGreen();
                                int b = colors.getBlue();
                                String hex = String.format("%02x%02x%02x", r, g, b);
                                System.out.println(hex);
                                StringSelection stringSelection = new StringSelection(hex);
                                Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
                                clipboard.setContents(stringSelection, null);
                                try {
                                    String format = "jpg";
                                    String filePath = "#" + hex + "." + format;
                                    Path path = createFileWithDir("jpg", filePath);
                                    int width = 200, height = 200;
                                    BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
                                    Graphics2D ig2 = bi.createGraphics();
                                    ig2.setPaint(colors);
                                    ig2.fillRect(0, 0, width, height);
                                    ImageIO.write(bi, format, new File(String.valueOf(path)));
                                    Desktop desktop = null;
                                    if (Desktop.isDesktopSupported()) {
                                        desktop = Desktop.getDesktop();
                                        desktop.open(new File("jpg"));
                                    }
                                } catch (IOException ie) {
                                    ie.printStackTrace();
                                }
                            } catch (AWTException e) {
                                System.err.println(e.getMessage() + " выбор цвета");
                                System.exit(0);
                            }
                            stopMouseListener();
                        }
                    }
                    @Override
                    public void nativeMouseClicked(NativeMouseEvent nativeMouseEvent) {
                    }
                    @Override
                    public void nativeMouseReleased(NativeMouseEvent nativeMouseEvent) {
                    }
                });
            }
        }
    }
    public void nativeKeyReleased(NativeKeyEvent e) {
        if (e.getKeyCode() == NativeKeyEvent.VC_ALT_L){
            ctrlIsReleasedNow();
        }
    }
    public void nativeKeyTyped(NativeKeyEvent e) {
    }
    private void doSmthWithMouseListeners () {
        mouseListenerIsActive = true;
    }
    private void stopMouseListener() {
        mouseListenerIsActive = false;
    }
    private void ctrlIsPressedNow() {
        ctrlIsPressed = true;
    }
    private void ctrlIsReleasedNow() {
        ctrlIsPressed = false;
    }
    public static Path createFileWithDir(String directory, String filename) {
        File dir = new File(directory);
        if (!dir.exists()) dir.mkdirs();
        return Paths.get(directory + File.separatorChar + filename);
    }
}

метод main

    package com.colorDropper;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
public class TestMain {
    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);
        }
        GlobalScreen.addNativeKeyListener(new GlobalListener());
    }
}
Answer 1

Скорее всего никак. Это сложно даже для нативных языков, а тут если нет такой библиотеки, считай нельзя. JNativeHook тут не поможет 100% Вариант сделать прозрачное окно и влепить его поверх всего экрана, или сделать скриншот и поставить его на весь экран. После клика окно спрятать и продолжать работу

READ ALSO
Как получить только одно поле обьектов в массиве ? (Java)

Как получить только одно поле обьектов в массиве ? (Java)

К примеру есть ArrayList c обьектами а1, а2, а3У обьектов есть поля в1, в2, в3

130
Как примагнитить точку к линии?

Как примагнитить точку к линии?

Попасть в линию очень тяжелоПодскажите сделать, что кликнув рядом с линией понять, что кликнули рядом и поставить точку на линию? Так же, если...

104
Задержка перед сменой слайда в Swiper Slider

Задержка перед сменой слайда в Swiper Slider

Имеется Swiper sliderПосле клика по кнопке Next или свайпа необходимо добавить анимацию перед сменой слайда

120
Почему падает браузер?

Почему падает браузер?

Почему при написании этого кода в консоль у меня падает браузер?

97