如何在Java中捕获全局按键

Sne*_*ish 4 java

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

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

Thu*_*der 6

尝试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();
}
Run Code Online (Sandbox Code Playgroud)

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

<dependency>
    <groupId>com.1stleg</groupId>
    <artifactId>jnativehook</artifactId>
    <version>2.1.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)


Nik*_*hev 3

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

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

另一个简单的解决方案是将 Windows hook 与 JNA 结合使用:

Windows 中的 JNA 键盘挂钩

我有一些使用 JNA 的经验并且非常喜欢这个 api。

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

就可移植性而言,据我所知,Windows dll 和 API 架构在响应用户输入方面已保留在不同的操作系统版本中。如果内存可用,则用户输入的挂钩位于 user32 dll 中。也许您必须克服一些困难才能获得 x64 位版本,但我怀疑这会那么难。