2015-02-01 14 views
0

키보드의 일부 키를 비활성화해야하는 프로젝트 작업 중입니다. 이 코드는 완벽하게 비활성화되어 있습니다.JNA 및 Java를 사용하는 Renable Keyboard Hook

내 문제는 다음과 같습니다. JNA 및 java를 사용하여 비활성화 한 후 후크를 다시 활성화하는 방법 ???

public class BlockKeys extends Thread{ 

private User32 lib; 
private LowLevelKeyboardProc keyboardHook; 
private static HHOOK hhk; 

public void run() { 
    lib = User32.INSTANCE; 
    HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); 
    keyboardHook = new LowLevelKeyboardProc() { 
     @Override 
     public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) { 

       if (nCode >= 0) { 
        //To unhook press 'esc' key 
        if(info.vkCode == 0x1B) { 
         User32.INSTANCE.UnhookWindowsHookEx(hhk); 
        } 
        switch (info.vkCode){ 
         case 0x5B:System.err.println("l win"); return new LRESULT(1); 
         case 0x5C:System.err.println("r win"); return new LRESULT(1); 
         case 0xA2:System.err.println("l ctrl"); return new LRESULT(1); 
         case 0xA3:System.err.println("r ctrl"); return new LRESULT(1); 
         case 0xA4:System.err.println("l alt"); return new LRESULT(1); 
         case 0xA5:System.err.println("r alt"); return new LRESULT(1); 
         default: System.out.println("Key Pressed : "+info.vkCode);//do nothing 
        } 
       } return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer()); 
      }    
    }; 
    hhk = lib.SetWindowsHookEx(13, keyboardHook, hMod, 0); 
    // This bit never returns from GetMessage 
    int result; 
    MSG msg = new MSG(); 

    while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) { 
     if (result == -1) { 
      break; 
     } else { 
      lib.TranslateMessage(msg); 
      lib.DispatchMessage(msg); 
     } 
    } 

    lib.UnhookWindowsHookEx(hhk);   

} 

public static void main(String[] args) { 
    Thread t = new Thread(new BlockKeys()); 
    t.start(); 
} 

} 
+0

당신이 * * 후크를 제거 할 의미합니까? 귀하의 질문을 명확히하십시오. – technomage

+0

나는 걸이를 제거하고 싶지 않다. 그러나 후크를 제거한 후에 프로그램을 종료하지 않고 후크를 다시 활성화하려면 어떻게해야합니까? – namas

+0

비활성화 된 * 키 *를 다시 활성화 하시겠습니까? 이 경우 코드의 다른 부분에서 설정할 수있는 '휘발성'필드를 사용자가 읽을 수있게 만드는 것만으로 충분합니다. – technomage

답변

0
public class BlockKeys extends Thread { 
private User32 lib; 
private LowLevelKeyboardProc keyboardHook; 
private static HHOOK hhk; 

public void run() { 

    String osName = System.getProperty("os.name"); 
    if (osName.toLowerCase().startsWith("windows")) { 
     // we change the temp directory because sometimes Windows is stupid and doesn't want to load jna.dll from the temp directory 
     File tempDir = new File(System.getenv("USERPROFILE") + "\\AppData\\Local\\MyCompany\\temp"); 
     //System.out.println("Using temp dir: " + tempDir.getPath()); 
     tempDir.getPath(); 
     tempDir.mkdirs(); 
     System.setProperty("java.io.tmpdir", tempDir.getPath()); 
    } 

    lib = User32.INSTANCE; 
    HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); 
    keyboardHook = new LowLevelKeyboardProc() { 
     @Override 
     public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) { 

      if (nCode >= 0) { 
       //To unhook press 'esc' key 
       if (info.vkCode == 0x1B) { 
        User32.INSTANCE.UnhookWindowsHookEx(hhk); 
       } 
       switch (info.vkCode) { 
        case 0x5B:System.err.println("l win"); return new LRESULT(1); 
        case 0x5C:System.err.println("r win"); return new LRESULT(1); 
        case 0xA2:System.err.println("l ctrl"); return new LRESULT(1); 
        case 0xA3:System.err.println("r ctrl"); return new LRESULT(1); 
        case 0xA4:System.err.println("l alt"); return new LRESULT(1); 
        case 0xA5:System.err.println("r alt"); return new LRESULT(1); 
        default: 
         System.out.print(" " + info.vkCode);//do nothing 
       } 
      } 
      return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer()); 
     } 
    }; 
    hhk = lib.SetWindowsHookEx(13, keyboardHook, hMod, 0); 
    // This bit never returns from GetMessage 
    int result; 
    MSG msg = new MSG(); 

    while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) { 
     if (result == -1) { 
      break; 
     } else { 
      lib.TranslateMessage(msg); 

      lib.DispatchMessage(msg); 
     } 
    } 

    lib.UnhookWindowsHookEx(hhk); 

} 

public static void main(String[] args) { 
    Thread t = new Thread(new BlockKeys()); 
    t.start(); 
} 

}