有没有办法在没有JFrame的情况下获得键盘事件?

时间:2011-01-05 20:53:05

标签: java swing keyboard keyboard-events event-listener

当用户按下某个快捷方式时,我想让我的程序取消隐藏主窗口。有没有办法获得全局关键事件,而不仅仅是当焦点在应用程序框架内时发生的事件?

3 个答案:

答案 0 :(得分:4)

这可能会做你想要的。请注意,此代码正在检查Ctr-F击键。我使用此代码从应用程序中的任何内容打开查找对话框。我很确定该应用程序必须具有焦点。至少要尝试的东西......

AWTEventListener listener = new AWTEventListener() {
  @Override
  public void eventDispatched(AWTEvent event) {
    try {
      KeyEvent evt = (KeyEvent)event;
      if(evt.getID() == KeyEvent.KEY_PRESSED && evt.getModifiers() == KeyEvent.CTRL_MASK && evt.getKeyCode() == KeyEvent.VK_F) {

      }
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
};

            Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.KEY_EVENT_MASK);
编辑:我想我明白你想要什么。基本上当应用程序没有焦点时。如果是这样,那么您可能必须使用本机API(JNI)挂钩操作系统事件,但这会强制您使用特定的操作系统......

答案 1 :(得分:3)

This可能有用。我不确定是否有一个适用于Windows / Linux / Mac的库。对于Windows,您将需要一些使用本机代码创建键盘钩子的外部库。我不知道如何在其他操作系统上执行此操作。

答案 2 :(得分:-1)

使用JFrame进行此操作的一种解决方案是将其不透明度设置为0.0,并向其中添加Keylistener。但是用户将在其快捷栏中看到一个图标...