2010-03-21 64 views
3

是否可以使用java禁用windows鍵和alt +選項卡...是否可以使用java禁用Windows鍵

+0

除非使用內核模式設備驅動程序,否則某些擊鍵無法捕捉。爲什麼Windows允許應用程序阻止您切換當前任務? –

+0

雖然你有點Alt + Tab,但實際上有一個很好的例子,可以在遊戲等全屏應用中禁用Win鍵。我無法告訴你有多少次我在遊戲中意外碰到了左側的Win鍵,只是爲了讓整個屏幕最小化。 – Will

+0

@ Will--據推測,Windows設計師認爲不然... –

回答

6

您可以使用JNA來實現此目的。

在類路徑中包含jna.jar和platform.jar並創建以下類。 該類禁用左窗口鍵(0x5B)和右窗口鍵(0x5C)。所以你可以在switch case語句中添加其他代碼。

應用程序啓動時儘快調用KeyHook.blockWindowsKey()。另一方面,在app關閉時調用unblockWindowsKey()。

由於代碼僅在isWindows()爲true時執行,所以即使在另一個操作系統上運行時也可以始終調用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?你的代碼運行良好,但不能阻止ctrl-alt-del。任務管理器出現 – MOD

相關問題