Что-то, что вы можете сделать, это реализовать интерфейс KeyListener
и передать состояния всем интересующим вас клавишам.
Если вы хотите проверить, например, нажаты ли клавиши со стрелками на снимке экрана, вы можете реализовать этот интерфейс KeyListener
и переопределить методы keyPressed()
и keyReleased()
и установить состояние для этих клавиш. заинтересованы в keyPressed
или keyReleased
. В зависимости от события. Таким образом, когда появляется скриншот, вы можете просто прочитать состояние этих клавиш
Если вам нужно, чтобы это решение было глобальным, независимо от фокуса приложения, вы можете написать небольшой хук в C, который вы можете интегрировать с Java Native Interface для прослушивания ключевых событий. Java не позволяет прослушивать ключевые события, если вы не подключили слушателя к компоненту, а этот компонент был в фокусе. Взгляните на JNativeHook .
Если вам просто нужно, когда ваше приложение сфокусировано, но на каждом компоненте, вы можете незаметно присоединить слушатель ко всем вашим компонентам или вы можете написать свой собственный KeyEventDispatcher и зарегистрировать его в KeyBoardFocusManager. Таким образом, пока ваше приложение имеет фокус, независимо от компонента, который имеет конкретную фокусировку, вы можете перехватывать все события клавиатуры. См:
public class YourFrame extends JFrame {
public YourFrame() {
// Finish all your layout and add your components
//
// Get the KeyboardFocusManager and register your custom dispatcher
KeyboardFocusManager m = KeyboardFocusManager.getCurrentKeyboardFocusManager();
m.addKeyEventDispatcher(new YourDispatcher());
}
private class YourDispatcher implements KeyEventDispatcher {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_TYPED) {
// Do something to change the state of the key
} else if (e.getID() == KeyEvent.KEY_PRESSED) {
// Do something else
}
return false;
}
}
public static void main(String[] args) {
YourFrame yF = new YourFrame();
yF.pack();
yF.setVisible(true);
}
}