如何在java中捕获全局键按下

时间:2013-04-23 22:00:32

标签: java

我用Java创建了一个简单的媒体播放器,但我想要记录全局按键,如 Ctrl + P 来暂停/恢复当前正在播放音乐没有JFrame有焦点但似乎由于JVM安全问题而无法实现。

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

2 个答案:

答案 0 :(得分:5)

尝试 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>

答案 1 :(得分:4)

Jintellitype是一个有点简单的解决方案。

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

另一个简单的解决方案是使用JNA的Windows钩子:

JNA Keyboard Hook in Windows

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

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

可移植性据我所知,就响应用户输入而言,windows dlls和api架构已在不同的OS版本中保留。如果内存服务,用户输入的钩子在user32 dll中。也许你必须跳过一些x64位版本的箍,但我怀疑它会那么难。