Управление формой с клавиатуры

Кто не null, ActiveControl? Я же делаю его null, иначе форма не принимает фокус и KeyDown ей не приходит.

По-моему это не убирает фокус.

А вызов фокуса на самой форме вообще хз что делать должен.

На это влияет KeyPreview.

Всё приходит.

Peek 2021-06-29 11-40

Кроме таба, его можно добавить так Tab and KeyDown event
Но обычно хватает стандартного поведения, иначе как клавиатурой фокус менять.

Убирает. Добавьте кнопку и по ней будет видно. С кнопки точно убирает.

В параллельной вселенной он должен делать SetFocus(formHandle); как на WinAPI и фокус не должен сам никуда слетать.

сделайте

        private void form1_MouseDown(object sender, MouseEventArgs e)
        {
            ActiveControl = null;
            Focus();
        }

и проверьте.

Стрелки видимо меняют фокус если текущий контрол их не обрабатывает.

А зачем так делать? Просто e.Handled = true; если обработали клавиши.

Мне надо обрабатывать нажатия только если ни один контрол не активен. Конечно, можно, наверное, при каждом нажатии как-то перебрать все контролы и проверить их активность. Но это опять костыли костыли костыли.
Да и при том, при нажатии на стрелки фокус всё-равно куда-то уходит, так что, не помогло бы.

Так это делается как и

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            Debug.WriteLine(e.KeyCode);
            Debug.WriteLine($"ActiveControl = {ActiveControl}");
            if (ActiveControl != null)
            {
                return;
            }

            if (e.KeyCode == Keys.Up)
            {
                Debug.WriteLine("⬆️");

                e.Handled = true;
            }
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            ActiveControl = null;
            Focus();
        }

        protected override bool IsInputKey(Keys keyData)
        {
            return keyData == Keys.Up || base.IsInputKey(keyData);
        }

:thinking:
Еще не пробовал, но в чём тут магия? Почему так контролы не будут активироваться при нажатии стрелок?
Проверил - абсолютно то же самое. Нажимаю на стрелки и ListBox активируется. Зачем это сделано и как отключить?
И, кстати, по ссылке там совершенно другая проблема, с данной темой никак не связанная.
Или имелось ввиду создать наследников от ListBox / Button и этот код туда вставить? Но похоже, что нет.

Листбокс не причем.

Задача же

Если добавить IsInputKey у формы, то когда нет фокуса стрелки будут попадать в KeyDown тоже.

Peek 2021-06-29 16-21

У листбокса и текстбокса оно и так есть и ловится.
Если у кнопок и т.п. тоже надо, то вроде можно без наследников
https://stackoverflow.com/a/1318308/964478
Control.PreviewKeyDown Event (System.Windows.Forms) | Microsoft Docs

ну и, естественно, чтобы при нажатии клавиш фокус с формы никуда не уходил, иначе

уже активен

Так он и не уходит если они в IsInputKey формы.

уходит

Выше показано, что нет.
Так что либо нет KeyPreview, либо что-то другое странное в коде.

Вы там только вверх нажимаете, а надо во все стороны. В одном из предыдущих постов я делал поправку на это.

Так надо просто добавить все стрелки )

Я добавлял и нифига :man_shrugging:

А в коде что сейчас?

Ну вот так можно сделать.

 InitializeComponent();

            foreach (Control control in Controls)
            {
                control.PreviewKeyDown += (ox, ex) =>
                {
                    if (ex.KeyData == Keys.Up || ex.KeyData == Keys.Down)
                    {
                        ex.IsInputKey = true;                       
                    }
                };
            }

Это если надо чтобы при любом фокусе. А тут задача только когда нет фокуса, так что IsInputKey или PreviewKeyDown только у формы нужен.

нет фокуса на чем?

На элементах формы.
В коде выше кликом по форме снимается.