【问题标题】:How to disable/override Windows 10 Hotkeys with C#如何使用 C# 禁用/覆盖 Windows 10 热键
【发布时间】:2019-01-24 06:50:29
【问题描述】:

我正在尝试注册某些热键,但我不能,因为它们是 Windows 默认设置。

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。

我发现的每一页都描述了如何使用 AutoHotKey 完成此操作。

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

有人有想法吗?

【问题讨论】:

  • 这是 XY problem 的示例吗?您是否正在尝试创建自助服务终端应用程序?
  • 不,就个人而言,我无法忍受 WIN+LEFT/RIGHT。另外,我正在处理这个...github.com/mzomparelli/zVirtualDesktop
  • 我暂时记下了代码。我可能会把它放回去。所有的提交仍然存在。
  • 我真的找不到除 AHK 以外的任何信息,我需要使用 C#。我不知道在哪里可以发布这个。我相信这个问题会受到好奇的人的追捧。
  • 哦,哈哈。我不是在窥探你:) 编辑:哦,你也刚刚回答了另一个问题。不错的一个:)

标签: c# windows-10 hotkeys


【解决方案1】:

使用键盘钩子可以做到这一点。可以在 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;
        }
    }

【讨论】:

  • 您好,一切进展如何。解决方案有进展吗?非常感谢
猜你喜欢
  • 1970-01-01
  • 2020-12-14
  • 2010-09-16
  • 2012-07-06
  • 2020-12-26
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多