2013-04-23 58 views
2

我在Java中做了一个简单的媒体播放器,但我想记录全球按键像按Ctrl + P暂停/恢复当前正在播放的音乐没有的JFrame有焦点但它似乎不可能由于JVM安全问题。如何捕获全球按键在java中

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

+0

实现自己的方法在Windows中,你会需要使用JNI或JNA。这是可行的,但如果您不熟悉Windows API和C编码,则会涉及到一些学习曲线。 – 2013-04-23 22:02:10

+0

我熟悉C编码,但不熟悉Windows API。请建议我从哪里开始或搜索什么,因为我非常渴望为我的项目实施它。 – Snehasish 2013-04-23 22:12:51

+0

对于Windows API,谷歌MSDN库,因为它都可以在那里找到。至于JNI,你会希望谷歌的教程。 JNA更易于使用,但需要下载JNA库。 – 2013-04-23 22:23:06

回答

4

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

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

其他简单的解决方法是使用Windows钩子与JNA:

JNA Keyboard Hook in Windows

我有JNA一些经验,并真正喜欢的API。

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

就我所知,可移植性方面,只要响应用户输入,windows dll和api体系结构已保存在不同的操作系统版本中。如果内存服务,用户输入的钩子在user32 dll中。也许你不得不跳过一些x64位版本的圈套,但我怀疑这会很难。

+0

因此,我将不得不单独编码32位和64位体系结构? – Snehasish 2013-04-24 06:36:35

+0

可能不是,但有可能。我希望user32 dll可以在x86和x64架构上出现。不过,我至少会在64位操作系统上运行它,看它是否有效。希望它确实如此。 – 2013-04-24 07:57:53

+0

谢谢..我会尽力的。 – Snehasish 2013-04-24 11:07:04

2

尝试JNativeHook。下面是展示如何使用它来捕捉全球按键的例子:如果你使用maven

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(); 
} 

,添加到您的pom.xml

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

哇。这似乎很有希望。谢谢。 – Snehasish 2017-05-20 10:45:26