Перевести комбинацию клавиш в текстовую строку


        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            string t = ModifiersToString(e.Modifiers) + e.KeyCode.ToString();
            System.Diagnostics.Debug.WriteLine(t);
        }

        private string ModifiersToString(Keys keys)
        {
            string res = string.Empty;
            if (keys != Keys.None)
            {
                if ((keys & Keys.Control) == Keys.Control)
                {
                    res += "Control + ";
                }
                if ((keys & Keys.Shift) == Keys.Shift)
                {
                    res += "Shift + ";
                }
                if ((keys & Keys.Alt) == Keys.Alt)
                {
                    res += "Alt + ";
                }
            }
            return res;
        }

Но получается какая-то фигня.


Shift + ShiftKey
Control + ControlKey
Control + Alt + Menu
Control + Alt + ControlKey
и т.п.

А если делать двойную проверку по-Дударевски

            string t = ModifiersToString(e.Modifiers);
            if (e.KeyCode != Keys.ControlKey && e.KeyCode != Keys.ShiftKey && e.KeyCode != Keys.Menu)
                t += e.KeyCode.ToString();
            System.Diagnostics.Debug.WriteLine(t);

Тогда работает. Но это ведь так не делается, наверное :man_shrugging:

А, кажется дошло. Модификатор и кнопка это же разные вещи :man_facepalming: Но тогда почему нету AltKey? :thinking: Есть только Alt :man_shrugging: Видимо, AltKey это Menu :thinking:
Почему они тогда Return в Enter переименовали, а Menu в AltKey - нет? :man_facepalming:
Почему нельзя было написать ModControl, ModShift, ModAlt? :man_facepalming: Так ведь понятнее.

А кнопка Apps… это что вообще? :dizzy_face: Если она открывает меню ПКМ, может её стоило так и назвать - ContextMenu, не? :man_shrugging:
Видимо, лет 30 назад эта кнопка открывала список каких-то программ. Но почему сейчас не открывает, если называется Apps?

Может нужен e.KeyData?

И для вывода может подойдет KeysConverter Class (System.Windows.Forms) | Microsoft Docs

Да не, оно и так работает. Просто с названиями клавиш полная хрень.
И, почему-то, когда нажимаю Alt, он иногда определяет, что ControlKey тоже нажат :thinking:


        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            Keys k = Keys.Control | Keys.Shift | Keys.L;
            if (e.KeyData == k)
            {
                KeysConverter keysConverter = new KeysConverter();
                string s = keysConverter.ConvertToString(e.KeyData);
                System.Diagnostics.Debug.WriteLine(s);
                return;
            }

Выдаёт строку Ctrl+Shift+L, а хотелось бы с пробелами :man_shrugging:

string s = keysConverter.ConvertToString(e.KeyData).Replace("+", " + ");
Хотя может быть это можно сделать и более цивилизованно. Не знаю си-шарп.

Тогда обратная конвертация не будет работать :man_shrugging: Лучше уж всё вручную.
Затык был с названиями кнопок, но я уже разобрался.