您可以做的就是实现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);
}
}