如何使用 C# 禁用/覆盖 Windows 10 热键

How to disable/override Windows 10 Hotkeys with C#(如何使用 C# 禁用/覆盖 Windows 10 热键)
本文介绍了如何使用 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 热键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)