我查看了一些示例,并尝试在Google上搜索了几个小时,但似乎我找不到涵盖我要问的问题.
如果我想做类似的事情
同时使用W + A,并将其作为单独的键事件注册,而不是单独注册为W和A,我将如何使用JNativeHook进行此操作?是因为我在某个地方错过了一个涵盖这个的课程,还是只有一个解决方法只能阅读一个关键?
我试图在控制台中执行它(因此我使用此库而不是Swing).
我拿了他们的例子,想尝试修改它:
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
public class GlobalKeyListener implements NativeKeyListener {
@Override
public void nativeKeyPressed(NativeKeyEvent e) {
System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
GlobalScreen.unregisterNativeHook();
}
}
@Override
public void nativeKeyReleased(NativeKeyEvent e) {
System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}
@Override
public void nativeKeyTyped(NativeKeyEvent e) {
System.out.println("Key Typed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook();
} catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
System.exit(1);
}
//Construct the example object and initialze native hook.
GlobalScreen.getInstance().addNativeKeyListener(new GlobalKeyListener());
}
}
Run Code Online (Sandbox Code Playgroud)
您需要监听每个单独的按键按下和释放事件,以获得所需的组合,并在按下每个按键时设置某种标记。如果在按下所需的键之一后,并且满足标记条件,那么当这些键同时按下时,您可以执行所需的操作。如果不创建自定义键盘驱动程序,则无法获得两个键的单个事件。如果您的目标是在同时按下W和A键事件之前将其抑制,请查看Wiki中不受支持的使用事件部分。请注意,事件抑制仅在Windows和OS X目标上可用,并且抑制的事件将不会传递到其他应用程序。
它不是最漂亮的示例,但是应该可以满足您的需求。
private short hotKeyFlag = 0x00;
private static final short MASK_A = 1 << 0;
private static final short MASK_W = 1 << 1;
...
@Override
public void nativeKeyPressed(NativeKeyEvent e) {
if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
GlobalScreen.unregisterNativeHook();
}
else if (e.getKeyCode() == NativeKeyEvent.VK_A) {
hotKeyFlag &= MASK_A;
// Check the mask and do work.
if (hotKeyFlag == MASK_A & MASK_W) {
// Fire Shortcut.
}
}
else if (e.getKeyCode() == NativeKeyEvent.VK_W) {
hotKeyFlag &= MASK_W;
// Check the mask and do work.
if (hotKeyFlag == MASK_A & MASK_W) {
// Fire Shortcut.
}
}
}
@Override
public void nativeKeyReleased(NativeKeyEvent e) {
if (e.getKeyCode() == NativeKeyEvent.VK_A) {
hotKeyFlag ^= MASK_A;
}
else if (e.getKeyCode() == NativeKeyEvent.VK_W) {
hotKeyFlag ^= MASK_W;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的回答:-
private boolean a = false, w = false;
@Override
public void nativeKeyPressed(NativeKeyEvent e) {
if (e.getKeyCode() == NativeKeyEvent.VC_A) {
a = true;
if (w) {
System.out.println("W+A");
} else {//remove this else only for testing
System.out.println("Only A");
}
} else if (e.getKeyCode() == NativeKeyEvent.VC_W) {
w = true;
if (a) {
System.out.println("A+W");
} else {//remove this else only for testing
System.out.println("Only W");
}
}
}
@Override
public void nativeKeyReleased(NativeKeyEvent e) {
if (e.getKeyCode() == NativeKeyEvent.VC_A) {
a = false;
} else if (e.getKeyCode() == NativeKeyEvent.VC_W) {
w = false;
}
}
@Override
public void nativeKeyTyped(NativeKeyEvent e) {
//System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
}
Run Code Online (Sandbox Code Playgroud)