2017-04-07 4 views
1

J'essaie d'enregistrer certains raccourcis clavier, mais je ne peux pas parce qu'ils sont par défaut Windows.Comment désactiver/remplacer les touches d'accès rapide Windows 10 avec C#

CTRL+WIN+1 minimizes the current window. I'd like it to do something else. 
I'd like to completely disable WIN+LEFT/RIGHT. 
I'm also trying to handle the CTRL+WIN+Arrow in my own virtual desktop manager. 

zVirtualDesktop

Cela doit être fait en utilisant C# et API Win32 si nécessaire. Il ne peut absolument pas utiliser Autohotkey.

Chaque page que je trouve décrit comment cela peut être fait avec AutoHotKey.

Je posterais du code, mais je ne sais vraiment pas par où commencer. J'utilise Win32 pour enregistrer des raccourcis clavier. Je suppose qu'il existe un moyen de les contourner, mais je ne trouve aucune information.

Est-ce que quelqu'un a une idée?

+0

Est-ce un exemple d'un _ [problème XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) _? Essayez-vous de créer une application de kiosque? – MickyD

+0

Non, personnellement, je ne peux pas supporter WIN + LEFT/RIGHT. Aussi, je travaille sur ce ... https: //github.com/mzomparelli/zVirtualDesktop –

+0

J'ai pris le code pour le moment. Je pourrais le remettre en place. Tous les commits sont toujours là. –

Répondre

3

Il est possible de le faire en utilisant un crochet du clavier. Une bonne classe de crochet pour ce qui peut être trouvé sur ce CodeProject Article

En utilisant le code ci-dessous empêchera le WIN + GAUCHE ou WIN + DROIT de se produire. Vous pouvez l'utiliser pour remplacer les clés de votre choix.

Cela remplacera même les raccourcis clavier que vous avez ajoutés via RegisterHotKey Win API. Une fois que vous avez ces classes dans votre projet, vous pouvez ajouter des gestionnaires à la classe HookManager statique comme ci-dessous.

//It's worth noting here that if you subscribe to the Key_Press event then it will break the international accent keys. 
HookManager.KeyPress += HookManager_KeyPress; 
HookManager.KeyDown += HookManager_KeyDown; 
HookManager.KeyUp += HookManager_KeyUp; 

Vous pouvez également ajouter des événements de souris, mais pour plus de simplicité, je montre simplement le crochet du clavier.

J'ai également créé une liste générique afin que je sache quelles touches sont actuellement désactivées et que je les supprime de la liste sur l'événement KeyUp.

public static List<Keys> keysDown = new List<Keys>(); 
private static void HookManager_KeyDown(object sender, KeyEventArgs e) 
     { 
      //Used for overriding the Windows default hotkeys 
      if(keysDown.Contains(e.KeyCode) == false) 
      { 
       keysDown.Add(e.KeyCode); 
      } 

      if (e.KeyCode == Keys.Right && WIN()) 
      { 
       e.Handled = true; 
       //Do what you want when this key combination is pressed 
      } 
      else if (e.KeyCode == Keys.Left && WIN()) 
      { 
       e.Handled = true; 
       //Do what you want when this key combination is pressed 
      } 

     } 

     private static void HookManager_KeyUp(object sender, KeyEventArgs e) 
     { 
      //Used for overriding the Windows default hotkeys 
      while(keysDown.Contains(e.KeyCode)) 
      { 
       keysDown.Remove(e.KeyCode); 
      } 
     } 

     private static void HookManager_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      //Used for overriding the Windows default hotkeys 

     } 

     public static bool CTRL() 
     { 
      //return keysDown.Contains(Keys.LShiftKey) 
      if (keysDown.Contains(Keys.LControlKey) || 
       keysDown.Contains(Keys.RControlKey) || 
       keysDown.Contains(Keys.Control) || 
       keysDown.Contains(Keys.ControlKey)) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

     public static bool SHIFT() 
     { 
      //return keysDown.Contains(Keys.LShiftKey) 
      if (keysDown.Contains(Keys.LShiftKey) || 
       keysDown.Contains(Keys.RShiftKey) || 
       keysDown.Contains(Keys.Shift) || 
       keysDown.Contains(Keys.ShiftKey)) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

     public static bool WIN() 
     { 
      //return keysDown.Contains(Keys.LShiftKey) 
      if (keysDown.Contains(Keys.LWin) || 
       keysDown.Contains(Keys.RWin)) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

     public static bool ALT() 
    { 
     //return keysDown.Contains(Keys.LShiftKey) 
     if (keysDown.Contains(Keys.Alt) || 
      keysDown.Contains(Keys.LMenu) || 
      keysDown.Contains(Keys.RMenu)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
+0

Bonjour, comment tout va-t-il? Des progrès sur la solution? Merci beaucoup – Arthor