2010-03-21 1 views
3

это можно отключить клавиши окон и Alt + Tab с помощью Java ...это можно отключить клавиши Windows с помощью Java

+0

Некоторые нажатия клавиш невозможно отловить, если вы не используете драйвер устройства режима ядра. Почему Windows разрешает приложению препятствовать тому, чтобы вы отказались от текущей задачи? –

+0

Хотя у вас есть точка для Alt + Tab, на самом деле есть хороший случай для отключения клавиш Win в полноэкранных приложениях, таких как игры. Я не могу сказать, сколько раз я случайно натолкнулся на левую клавишу Win в игре, только чтобы минимизировать весь экран. – Will

+0

@Will - предположительно, разработчики Windows думают иначе ... –

ответ

6

Вы можете использовать ЮНА для достижения этой цели.

Включите jna.jar и platform.jar в путь к классам и создайте следующий класс. Этот класс отключает левый ключ окна (0x5B) и правый ключ окна (0x5C). Таким образом, вы можете добавить другие коды в оператор case switch.

Вызовите KeyHook.blockWindowsKey() как можно скорее, когда начнется ваше приложение. С другой стороны, вызовите unblockWindowsKey() при завершении работы приложения.

Поскольку код выполняется только в том случае, если isWindows() является истинным, вы всегда можете вызвать KeyHook.blockWindowsKey() даже при работе на другой ОС.

 


    import com.sun.jna.platform.win32.Kernel32; 
    import com.sun.jna.platform.win32.User32; 
    import com.sun.jna.platform.win32.WinDef.HMODULE; 
    import com.sun.jna.platform.win32.WinDef.LRESULT; 
    import com.sun.jna.platform.win32.WinDef.WPARAM; 
    import com.sun.jna.platform.win32.WinUser.HHOOK; 
    import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT; 
    import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc; 
    import com.sun.jna.platform.win32.WinUser.MSG; 


    public class KeyHook { 
     private static HHOOK hhk; 
     private static LowLevelKeyboardProc keyboardHook; 
     private static User32 lib; 

     public static void blockWindowsKey() { 
      if (isWindows()) { 
       new Thread(new Runnable() { 

        @Override 
        public void run() { 
         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 (info.vkCode){ 
             case 0x5B: 
             case 0x5C: 
              return new LRESULT(1); 
             default: //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); 
        } 
       }).start(); 
      } 
     } 

     public static void unblockWindowsKey() { 
      if (isWindows() && lib != null) { 
       lib.UnhookWindowsHookEx(hhk); 
      } 
     } 

     public static boolean isWindows(){ 
      String os = System.getProperty("os.name").toLowerCase(); 
      return (os.indexOf("win") >= 0); 
     } 
    } 

 
+0

Привет. Есть ли способ отключить ctrl-alt-del? Ваш код работает хорошо, но can not block ctrl-alt-del. Появляется диспетчер задач – MOD

Смежные вопросы