你如何在全球范围内获得当前的键盘状态?(即,无论查询应用程序是否具有焦点,当前按下了哪些键)

zer*_*ord 2 java keyboard keyboard-hook

我正在编写一个屏幕捕获工具,我希望能够在拍摄屏幕截图时存储键盘和鼠标的当前状态.

为鼠标执行此操作非常简单,因为以相关问题中描述的方式使用PointerInfo类可以为您提供当前鼠标位置的屏幕坐标以及所需的点击信息.但是,我还没能找到键盘的这个类的模拟; 所有与键盘相关的类似乎都是焦点特定的.

那么,有没有办法在Java中获得当前的键盘状态?

PS请记住,我正在寻找一个函数来调用以检索关于哪些键被按下的信息,而不是这些抑郁事件的监听器.

ugo*_*ugo 6

您可以做的就是实现KeyListener界面并为您感兴趣的所有键提供状态.

如果你感兴趣的检查,如果方向键被按下时的截图,例如,你可以实现此KeyListener接口,并覆盖keyPressed()keyReleased()方法,并设置状态对于那些你有兴趣到按键keyPressedkeyReleased.视情况而定.这样,当屏幕截图发生时,您可以只读取这些键的状态

如果您需要此解决方案是全局的,无论应用程序如何关注,您都可以在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);
    }
}
Run Code Online (Sandbox Code Playgroud)