Я пытаюсь написать диалоговое окно выбора разрешения, которое появляется при первом запуске программы. Чтобы не утомлять пользователя, я хочу реализовать довольно стандартную функцию: вы можете отключить это диалоговое окно с помощью флажка, но вернуть его, удерживая нажатой клавишу alt при запуске.
К сожалению, нет очевидного способа спросить java, является ли данный ключ в настоящее время нажимается. Вы можете зарегистрироваться только для получения информации о новых нажатиях клавиш через KeyListener, но это не помогает, если нажатие клавиш начинается до запуска приложения.




Я мало знаю о Java (в основном код на C#), но как насчет того, чтобы иметь небольшую программу-загрузчик, написанную на C, или что-то, что затем запускает ваше приложение Java с некоторыми параметрами (например, не работает ли определенный ключ)?
@Zarkonnen Есть ли у него JVM в комплекте с установщиком? Если да, то KeyboadUtils.isPressed будет работать в Windows, Mac и Linux.
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
public class LockingKeyDemo {
static Toolkit kit = Toolkit.getDefaultToolkit();
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter() {
public void windowActivated(WindowEvent e) {
System.out.println("caps lock1 = "
+ kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
try {
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_CONTROL);
} catch (Exception e2) {
System.out.println(e2);
}
System.out.println("caps lock2 = "
+ kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
}
});
frame.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
System.out.println("caps lock3 = "
+ kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Есть два типа обнаружения нажатия клавиш: по событию и по опросу. Если вы опрашиваете клавиатуру для KEY_PRESSED при запуске (через цикл с sleep.thread(timeInMs), постоянно проверяющим, не нажата ли ваша клавиша), вы можете определить, была ли она уже нажата при запуске.
public class LockingKeyDemo {
static Toolkit kit = Toolkit.getDefaultToolkit();
public static void main(String[] args) {
System.out.println("caps lock2 = "
+ kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
}
}
откуда мне импортировать класс Toolkit?
преодолело ли это решение проблемы, описанные в этом сообщении в блоге? Он вроде бы описывает этот метод как ненадежный, но он старый .... weblogs.java.net/blog/2007/11/02/log-me-log-me-out
Похоже, что вы можете это сделать, но только для Caps Lock и др. Следовательно, я перешел на использование Caps Lock для этой цели. Не идеально, но нормально.
На исходный вопрос, похоже, нет ответа. Предлагаемый метод определяет состояние клавиши блокировки, например CapsLock, ScrollLock и т. д. Поэтому он не будет работать для состояния нажатия Alt.
Рассмотрим следующий код:
com.sun.jna.platform.KeyboardUtils.isPressed(java.awt.event.KeyEvent.VK_ALT);
Единственная проблема заключается в том, что этот класс является внутренним классом Sun JDK и вряд ли будет доступен в какой-либо другой JVM. В зависимости от вашего проекта это может быть приемлемым, а может и неприемлемым.
Внутренне он вызывает User32.DLL в Windows:
User32.INSTANCE.GetAsyncKeyState(...)
Сложное решение в том, что программа хочет работать на Mac / Windows / Linux, а я недостаточно знаю C.