Странная проблема. У нас есть две формы: окно главного приложения и форма настроек. Основной форме установили ее KeyPreview на истинный, и метод, присоединенный к ее событию KeyUp. Это - то, так, чтобы окно настроек могло быть открыто с ключевым ярлыком (ctrl-m):
private void MyShortcuts(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.M)
{
e.Handled = true;
e.SuppressKeyPress = true;
MySettings sett = new MySettings();
sett.Show();
}
}
Теперь, тот бит работает просто великолепно. Однако проблема состоит в том, что несмотря на установку свойств Handled и SuppressKeyPress к истинному, событие KeyUp все еще передается MySettings
форма. Я проследил это до ControlNativeWindow.OnMessage
получение, что, кажется, другое событие (его свойства Handled и SuppressKeyPress имеют значение false), и передача этого к форме и его сфокусированному управлению.
Любые идеи будут очень цениться, у меня заканчиваются они самого.
Здесь происходит то, что клавиша M
и CTRL
вызывают два отдельных события KeyUp
(что является нормальным поведением ). Когда вы нажимаете CTRL
, а затем M
, а затем убираете палец с клавиши M
, возникает событие KeyUp
, которое обработчик на главной форме захватывает и использует для отображения формы настроек. Затем вы убираете палец с клавиши CTRL
, что вызывает другое событие KeyUp
(на этот раз в форме настроек, которая теперь является активной формой).
В форме настроек вы можете просто проверить e.Control
и проигнорировать событие, если оно истинно
.
Вместо события KeyUp вы должны использовать событие KeyDown.
Если вы посмотрите документацию , вы увидите, что перед событием KeyUp будет сгенерировано событие KeyPress, и это будет зафиксировано вашей формой настроек.