我用 Java 制作了一个简单的媒体播放器,但我想记录全局按键,如Ctrl+P以暂停/恢复当前正在播放的音乐,而 JFrame 没有焦点,但由于 JVM 安全问题,这似乎是不可能的。
我遇到了JNativeHook,但我只想为 Windows 实现我自己的方法。请建议如何做以及从哪里开始?
我用 Java 制作了一个简单的媒体播放器,但我想记录全局按键,如Ctrl+P以暂停/恢复当前正在播放的音乐,而 JFrame 没有焦点,但由于 JVM 安全问题,这似乎是不可能的。
我遇到了JNativeHook,但我只想为 Windows 实现我自己的方法。请建议如何做以及从哪里开始?
试试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>
Jintellitype 是一个比较简单的解决方案。
https://code.google.com/p/jintellitype/
另一个简单的解决方案是使用带有 JNA 的 windows 挂钩:
我对 JNA 有一些经验,并且非常喜欢这个 api。
第三种解决方案是使用 JNI 管理您自己的调用。
可移植性方面,据我所知,Windows dll 和 api 架构就响应用户输入而言,已保存在不同的操作系统版本中。如果没记错的话,用户输入的钩子在 user32 dll 中。也许您必须为 x64 位版本跳过一些障碍,但我怀疑这会很难。