2011-09-23 99 views
0

我已经实现了keyBoardHook,但是在shift键关闭时却无法检测到按下的字符。使用jna检测Shift键向下键

我已经尝试使用Windows的GetAsyncKeyState函数来检测何时按下shift键。但是这并没有处理shift + 2 = @。它覆盖了shift键并且输出了键码2.

我可以获得每一个键,但是Shift + 2都作为单独的键被检测到(尽管[SHIFT + 2]给出了我键盘上的@)。 IE:程序输出SHIFT和2,但不是它们产生的内容:@。

问题:

我怎样才能检测到移位键关闭时产生的字符。

我写的代码到目前为止。

public class Keyhook { 
private static volatile boolean quit; 
private static HHOOK hhk; 
private static LowLevelKeyboardProc keyboardHook; 

public static void main(String[] args) { 
    final User32 lib = User32.INSTANCE; 
    HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); 
    keyboardHook = new LowLevelKeyboardProc() { 
     public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) { 
      if (nCode >= 0) { 
       switch (wParam.intValue()) { 
        case User32.WM_KEYUP: 

        break; 
        case User32.WM_KEYDOWN: 
        if(lib.GetAsyncKeyState(160) == 1){ 
         System.out.println(info.vkCode);  
         } 
        break; 
        case User32.WM_SYSKEYUP: 

         break; 
        case User32.WM_SYSKEYDOWN: 
         System.err.println("in callback, key=" + info.vkCode); 
         if (info.vkCode == 81) { 
          quit = true; 
         } 
       } 
      } 
      return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer()); 
     } 
    }; 
    hhk = lib.SetWindowsHookEx(User32.WH_KEYBOARD_LL, keyboardHook, hMod, 0); 
    System.out.println("Keyboard hook installed, type anywhere, 'q' to quit"); 
    //noinspection ConstantConditions 
    new Thread() { 
     public void run() { 
      while (!quit) { 
       try { 
        Thread.sleep(10); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      System.err.println("unhook and exit"); 
      lib.UnhookWindowsHookEx(hhk); 
      System.exit(0); 
     } 
    }.start(); 

    // This bit never returns from GetMessage 
    int result; 
    MSG msg = new MSG(); 
    while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) { 
     if (result == -1) { 
      System.err.println("error in get message"); 
      break; 
     } else { 
      System.err.println("got message"); 
      lib.TranslateMessage(msg); 
      lib.DispatchMessage(msg); 
     } 
    } 
    lib.UnhookWindowsHookEx(hhk); 
} 
} 
+0

看看这个答案http://stackoverflow.com/q/6237250/233906它的解决方案http://melloware.com/products/jintellitype/index.html – Cerber

回答

0

有没有简单的方法来预测生成的输出(一些键组合不产生任何输出)。如果Java生成一个KeyTyped事件,则会在事件中提供生成的字符串,但我不认为有任何API(Java或本机)为您提供键字符串映射的击键。