如何使用 C# 禁用/覆盖 Windows 10 热键 [英] How to disable/override Windows 10 Hotkeys with C#

查看:26
本文介绍了如何使用 C# 禁用/覆盖 Windows 10 热键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to register certain hotkeys, but I can't because they are Windows defaults.

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.

This has to be done using c# and Win32 API if necessary. It absolutely cannot use Autohotkey.

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

Every page I find descibes how this can be done with AutoHotKey.

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

I'd post code, but I really don't know where to start. I use Win32 to register hotkeys. I assume there is a way to override them, but I can't find any info.

有人有想法吗?

推荐答案

可以使用键盘挂钩来做到这一点.一个很好的钩子类可以在这个 代码项目文章

It is possible to do this using a keyboard hook. A good hook class for this can be found on this CodeProject Article

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

Using the below code will prevent the WIN+LEFT or WIN+RIGHT from occurring. You can use this to override whichever keys you'd like.

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

This will even override hotkeys which you added via RegisterHotKey Win API.

在项目中拥有这些类后,您可以将处理程序添加到静态 HookManager 类,如下所示.

Once you have those classes in your project you can add handlers to the static HookManager class like below.

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

您也可以添加鼠标事件,但为简单起见,我只显示键盘挂钩.

You can also add mouse events, but for simplicity I'm just showing the keyboard hook.

我还创建了一个通用列表,以便知道哪些键当前处于关闭状态,并在 KeyUp 事件的列表中删除这些键.

I've also created a generic list so that I know which keys are currently down and I remove those keys from the list on the KeyUp event.

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

这篇关于如何使用 C# 禁用/覆盖 Windows 10 热键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆