Выбор клавиш для управления

Необходимо сделать выбор клавиш для управления. Помните, был такой древний видеоплеер Light alloy? Вот, надо сделать как там.
То есть, на второй форме лежит ListView со списком Действие | Клавиша. А в KeyDown первой формы обращаемся к этому списку и ищем действие для нажатой клавиши.
На Delphi я уже такое писал. Сейчас переписал на C#.
форма с ListView:

using System;
using System.Windows.Forms;
using static WindowsFormsApp3.ListViewKeyboard;

namespace WindowsFormsApp3
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            colAction.AspectToStringConverter = val =>
            {
                KeyAction action = (KeyAction)val;
                return action.ToString();
            };
            colKey.AspectToStringConverter = val =>
            {
                Keys k = (Keys)val;
                return k.ToString();
            };
        }
    }
}

Главная форма:

using System;
using System.Windows.Forms;
using static WindowsFormsApp3.ListViewKeyboard;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        private Form2 form2;
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            form2 = new Form2();
            form2.Show();
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            KeyAction action = form2.listViewKeyboard1.FindAction(e.KeyCode);
            System.Diagnostics.Debug.WriteLine(action.ToString());
        }
    }
}

И, собственно, сам компонент со списком:

using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using BrightIdeasSoftware;

namespace WindowsFormsApp3
{
    public class ListViewKeyboard : TreeListView
    {
        public enum KeyAction { Dummy, Action1, Action2 }

        public class KeyboardItem
        {
            public Keys KeyId { get; private set; }
            public KeyAction KeyAction { get; private set; }

            public KeyboardItem(Keys key, KeyAction action)
            {
                KeyId = key;
                KeyAction = action;
            }
        }

        public ListViewKeyboard()
        {
            View = View.Details;
            Roots = new List<KeyboardItem>();
            List<KeyboardItem> roots = Roots.Cast<KeyboardItem>().ToList();
            roots.Add(new KeyboardItem(Keys.A, KeyAction.Action1));
            roots.Add(new KeyboardItem(Keys.Space, KeyAction.Action2));

            UpdateObjects(roots);
        }

        public KeyAction FindAction(Keys key)
        {
            List<KeyboardItem> roots = Roots.Cast<KeyboardItem>().ToList();
            foreach (KeyboardItem item in roots)
            {
                if (item.KeyId == key)
                {
                    return item.KeyAction;
                }
            }
            return KeyAction.Dummy;
        }
    }
}

Компонент еще не допилен. Это только концепция того, как я это вижу.
В результате, оно работает. При нажатии A выдаётся Action1. При нажатии Space выдаётся Action2. А при нажатии клавиш, которых нет в списке - выдаётся Dummy. Как и задумано.
Но как это делается правильно?

Почему был?? Еще есть.

Так чтоб работало правильно )

Готового вроде бы ничего особо нет, но в целом задача вроде не сильно сложная. При редактировании клавиш надо просто где-то ловить что-то типа KeyDown и сохранять полученный KeyCode + Ctrl/Shift/Alt.

ИМХО. Начиная с какой-то версии, превратилось в лютый треш. Улучшения, конечно, были. Но я продолжал юзать версию 3.x. Что там у них сейчас, скачивать и проверять нет никакого желания.
Лет 8 назад наговнокодил свой плеер и почти ни разу не приходилось запускать другие.