Как отключить / переопределить Windows 10 горячих клавиш с помощью C#

Я пытаюсь зарегистрировать определенные горячие клавиши, но не могу, потому что они по умолчанию для 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 для регистрации горячих клавиш. Я предполагаю, что есть способ переопределить их, но я не могу найти информацию.

У кого-нибудь есть идея?

1 ответ

Решение

Это можно сделать, используя клавиатуру. Хороший хук-класс для этого можно найти в этой статье CodeProject.

Использование приведенного ниже кода предотвратит появление WIN+LEFT или WIN+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;
        }
    }
Другие вопросы по тегам