Как вы получаете текущее состояние клавиатуры в глобальном масштабе? (т. е. какие клавиши в данный момент нажаты, независимо от того, имеет ли фокус запрашивающее приложение) - PullRequest
2 голосов
/ 24 марта 2012

Я пишу утилиту захвата экрана, и я хотел бы иметь возможность сохранять текущее состояние клавиатуры и мыши при каждом снимке экрана.

Сделать это для мыши просто,поскольку использование класса PointerInfo способом, описанным в этом связанном вопросе , дает вам координаты экрана для текущего местоположения мыши и информацию о щелчке, если необходимо.Однако я не смог найти аналог этого класса для клавиатуры;все классы, связанные с клавиатурой, кажутся специфичными для фокуса.

Итак, есть ли способ получить текущее состояние клавиатуры в Java?

PS Помните, что я ищу функцию для вызовачтобы получить информацию о том, какие клавиши нажаты, не слушатель таких событий нажатия.

1 Ответ

5 голосов
/ 24 марта 2012

Что-то, что вы можете сделать, это реализовать интерфейс 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);
    }
}
...