Я пытаюсь сделать пипетку на 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());
}
}
Скорее всего никак. Это сложно даже для нативных языков, а тут если нет такой библиотеки, считай нельзя. JNativeHook тут не поможет 100% Вариант сделать прозрачное окно и влепить его поверх всего экрана, или сделать скриншот и поставить его на весь экран. После клика окно спрятать и продолжать работу
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
К примеру есть ArrayList c обьектами а1, а2, а3У обьектов есть поля в1, в2, в3
Попасть в линию очень тяжелоПодскажите сделать, что кликнув рядом с линией понять, что кликнули рядом и поставить точку на линию? Так же, если...
Имеется Swiper sliderПосле клика по кнопке Next или свайпа необходимо добавить анимацию перед сменой слайда