如何在java中捕获全局按键

如何在java中捕获全局按键,java,Java,我用Java制作了一个简单的媒体播放器,但我想录制全局按键,如Ctrl+p,以暂停/恢复当前播放的音乐,而JFrame没有焦点,但由于JVM安全问题,这似乎是不可能的 我遇到过这样的问题,但我只想为Windows实现我自己的方法。 请建议如何操作以及从何处开始?Jintellitype是一个比较简单的解决方案 另一个简单的解决方案是将windows钩子与JNA结合使用: 我对JNA有一些经验,并且非常喜欢这个api 第三种解决方案是使用JNI管理您自己的呼叫 就可移植性而言,据我所知,win

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

我遇到过这样的问题,但我只想为Windows实现我自己的方法。
请建议如何操作以及从何处开始?

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

另一个简单的解决方案是将windows钩子与JNA结合使用:

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

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

就可移植性而言,据我所知,windows DLL和api体系结构在响应用户输入方面已在不同的操作系统版本中得到保留。如果内存可用,则用户输入的挂钩位于user32 dll中。对于x64位的版本,您可能需要经历一些困难,但我怀疑这会有那么难。

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

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>

com.1stleg
jnativehook
2.1.0

要在windows中实现自己的方法,您需要使用JNI或JNA。这是可以做到的,但是如果你不熟悉Windows API和C编码,就会有一些学习过程。我熟悉C编码,但不熟悉Windows API。请建议我从哪里开始或搜索什么,因为我非常渴望在我的项目中实现它。对于Windows API,谷歌MSDN库,因为所有这些都可以在那里找到。至于JNI,你会想在谷歌上搜索教程。JNA更易于使用,但需要下载JNA库。因此我必须分别为32位和64位体系结构编写代码?可能不会,但也有可能。我希望User32DLL在x86和x64体系结构上都存在。不过,我至少会在64位操作系统上运行它,看看它是否有效。希望是这样。