2014-10-06 73 views
3

我看了一些例子,并试图在Google上搜索几个小时,但似乎我找不到一个涵盖我所问的问题。用JNativeHook注册多键压力机

如果我想这样做

W +一个在同一时间,并注册为一个独立的按键事件而不是仅仅作为W和单独的,我怎么会去这样做使用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()); 
    } 
} 

回答

3

你要听每一个人的按键和所需的组合释放事件,并设置一些种类标志为每个键被压下。如果在按下所需的一个键之后,并且符合条件,那么当这些键被按在一起时,您可以做任何你需要做的事情。如果不创建自定义键盘驱动程序,无法为两个键获取单个事件。如果您的目标是压制W和A关键事件,直到两者都按下,请查看维基的unsupported consuming events部分。请注意,事件抑制仅适用于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; 
    } 
} 
2

这就是我的回答: -

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