2017-04-07 15 views
1

我想注册某些热键,但我不能,因为他们是Windows的默认值。如何禁用/覆盖Windows 10热键与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

这有可能在必要时使用C#和Win32 API来完成。它绝对不能使用Autohotkey。

每一页我都会发现descibes如何使用AutoHotKey完成此操作。

我会发布代码,但我真的不知道从哪里开始。我使用Win32来注册热键。我认为有一种方法可以覆盖它们,但我找不到任何信息。

有没有人有想法?

+0

这是一个_ [XY问题]的示例(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)_?您是否想要创建自助服务终端应用程序? – MickyD

+0

不,在个人层面上,我无法忍受WIN + LEFT/RIGHT。另外,我正在研究... https://github.com/mzomparelli/zVirtualDesktop –

+0

我暂时忘记了代码。我可能会把它恢复。所有的提交仍然存在。 –

回答

3

使用键盘挂钩可以做到这一点。这方面的一个良好的钩类可以在此CodeProject Article

发现使用以下代码将防止WIN + LEFTWIN + RIGHT的发生。你可以用它来覆盖你想要的任何键。

这甚至会覆盖您通过RegisterHotKey Win API添加的热键。

一旦你在你的项目中有这些类,你可以添加处理程序到像下面这样的静态HookManager类。

//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; 

您还可以添加鼠标事件,但为了简单起见,我只是显示键盘钩子。

我还创建了一个通用列表,以便我知道哪些键当前处于关闭状态,并从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

你好,一切进展如何。解决方案的任何进展?非常感谢你 – Arthor