【问题标题】:Is there a way to get keyboard events without JFrame?有没有办法在没有 JFrame 的情况下获取键盘事件?
【发布时间】:2011-06-04 06:57:35
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这可能会做你想做的事。请注意,此代码正在检查 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) 挂钩操作系统事件,但这会迫使您使用特定的操作系统...

    【讨论】:

    • 伤心。我希望会有一些独立于平台的方式:(
    • 确保检查 altanis 在下面提供的链接。这有一些关于(可能)为什么它不在 Java 中的讨论。也许 OSX 没有这样的东西。我还没有完成足够的 OSX 编程来知道这是对还是错……
    • 这就是我所说的“草率”答案。这段代码是无用。您必须通过适当的导入和使用此 kbd 侦听器来实现它!简而言之,一个完全可行的代码!此外,我不认为它不使用 Jframe 或其他类型的框架。这绝对是一个“downvote”案例,但是,我从不这样做。我更喜欢对此发表评论。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      使用 JFrame 的解决方案是将其不透明度设置为 0.0 并为其添加 Keylistener。但是用户会在他的快捷方式栏中看到一个图标...

      【讨论】:

      • 此方法不允许用户与 JFrame 后面的窗口进行交互。并且 JFrame 仍然必须成为焦点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多