Кто не null
, ActiveControl
? Я же делаю его null
, иначе форма не принимает фокус и KeyDown
ей не приходит.
По-моему это не убирает фокус.
А вызов фокуса на самой форме вообще хз что делать должен.
На это влияет KeyPreview
.
Всё приходит.
Кроме таба, его можно добавить так 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);
}
Еще не пробовал, но в чём тут магия? Почему так контролы не будут активироваться при нажатии стрелок?
Проверил - абсолютно то же самое. Нажимаю на стрелки и ListBox
активируется. Зачем это сделано и как отключить?
И, кстати, по ссылке там совершенно другая проблема, с данной темой никак не связанная.
Или имелось ввиду создать наследников от ListBox
/ Button
и этот код туда вставить? Но похоже, что нет.
Листбокс не причем.
Задача же
Если добавить IsInputKey
у формы, то когда нет фокуса стрелки будут попадать в KeyDown
тоже.
У листбокса и текстбокса оно и так есть и ловится.
Если у кнопок и т.п. тоже надо, то вроде можно без наследников
https://stackoverflow.com/a/1318308/964478
Control.PreviewKeyDown Event (System.Windows.Forms) | Microsoft Docs
ну и, естественно, чтобы при нажатии клавиш фокус с формы никуда не уходил, иначе
уже активен
Так он и не уходит если они в IsInputKey
формы.
уходит
Выше показано, что нет.
Так что либо нет KeyPreview
, либо что-то другое странное в коде.
Вы там только вверх
нажимаете, а надо во все стороны. В одном из предыдущих постов я делал поправку на это.
Так надо просто добавить все стрелки )
Я добавлял и нифига
А в коде что сейчас?
Ну вот так можно сделать.
InitializeComponent();
foreach (Control control in Controls)
{
control.PreviewKeyDown += (ox, ex) =>
{
if (ex.KeyData == Keys.Up || ex.KeyData == Keys.Down)
{
ex.IsInputKey = true;
}
};
}
Это если надо чтобы при любом фокусе. А тут задача только когда нет фокуса, так что IsInputKey
или PreviewKeyDown
только у формы нужен.
нет фокуса на чем?
На элементах формы.
В коде выше кликом по форме снимается.