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

时间:2012-03-23 20:33:44

标签: java keyboard keyboard-hook

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

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

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

P.S。请记住,我正在寻找一个函数来调用以检索关于哪些键被按下的信息,这样的抑郁事件的听众。

1 个答案:

答案 0 :(得分:5)

您可以执行的操作是实现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);
    }
}