我正在编写一个屏幕捕获实用程序,我希望能够在拍摄屏幕截图时存储键盘和鼠标的当前状态。
为鼠标执行此操作非常简单,因为以PointerInfo中所述的方式使用related question类可为您提供当前鼠标位置的屏幕坐标以及所需的点击信息。但是,我还没能找到键盘的这个类的模拟;所有与键盘相关的类似乎都是焦点特定的。
那么,有没有办法在Java中获取当前的键盘状态?
P.S。请记住,我正在寻找一个函数来调用以检索关于哪些键被按下的信息,不这样的抑郁事件的听众。
答案 0 :(得分:5)
您可以执行的操作是实现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);
}
}