【问题标题】:How to capture global key presses in java如何在java中捕获全局按键
【发布时间】:2013-04-17 07:00:15
【问题描述】:

我用 Java 制作了一个简单的媒体播放器,但我想记录全局按键,如 Ctrl + P 以暂停/恢复当前在没有焦点的 JFrame 的情况下播放音乐,但由于 JVM 安全问题,这似乎是不可能的。

我遇到了JNativeHook,但我只想为 Windows 实现我自己的方法。 请建议如何做以及从哪里开始?

【问题讨论】:

  • 要在 Windows 中实现自己的方法,您需要使用 JNI 或 JNA。这是可行的,但如果您不熟悉 Windows API 和 C 编码,将会涉及一些学习曲线。
  • 我熟悉 C 编码,但不熟悉 Windows API。请建议我从哪里开始或搜索什么,因为我非常渴望为我的项目实施它。
  • 对于 Windows API,谷歌 MSDN 库,因为它都可以在那里找到。至于 JNI,您将需要 Google 获取教程。 JNA 更易于使用,但需要您下载 JNA 库。

标签: java


【解决方案1】:

试试 JNativeHook。下面是一个示例,展示了如何使用它来捕获全局按键:

try
{
    GlobalScreen.registerNativeHook();
    GlobalScreen.addNativeKeyListener(new NativeKeyListener()
    {

        @Override
        public void nativeKeyTyped(NativeKeyEvent nativeEvent)
        {
        }

        @Override
        public void nativeKeyReleased(NativeKeyEvent nativeEvent)
        {
            String keyText=NativeKeyEvent.getKeyText(nativeEvent.getKeyCode());
            System.out.println("User typed: "+keyText);
        }

        @Override
        public void nativeKeyPressed(NativeKeyEvent nativeEvent)
        {   
        }
     });
}
catch (NativeHookException e)
{
    e.printStackTrace();
}

如果您使用的是 maven,请将其添加到您的 pom.xml:

<dependency>
    <groupId>com.1stleg</groupId>
    <artifactId>jnativehook</artifactId>
    <version>2.1.0</version>
</dependency>

【讨论】:

    【解决方案2】:

    Jintellitype 是一个比较简单的解决方案。

    https://code.google.com/p/jintellitype/

    另一个简单的解决方案是使用带有 JNA 的 windows 挂钩:

    JNA Keyboard Hook in Windows

    我对 JNA 有一些经验,并且非常喜欢这个 api。

    第三种解决方案是使用 JNI 管理您自己的调用。

    就可移植性而言,据我所知,Windows dll 和 api 架构就响应用户输入而言,已保留在不同的操作系统版本中。如果没记错的话,用户输入的钩子在 user32 dll 中。也许您必须为 x64 位版本跳过一些障碍,但我怀疑这会很难。

    【讨论】:

    • 所以我必须分别为 32 位和 64 位架构编写代码?
    • 可能不会,但有可能。我希望 user32 dll 出现在 x86 和 x64 架构上。不过,我至少会在 64 位操作系统上运行它,看看它是否有效。希望是这样。
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2014-05-06
    相关资源
    最近更新 更多