Я знаю, что он довольно старый, но поскольку у меня возникла та же проблема, и когда я нашел какую-то разумную работу, я рад поделиться с вами здесь.
Решение приходит из события PreviewKeyDown
в WinFormОбъект ContextMenuStrip.Как только вы добавили это событие, просто используйте следующий код, чтобы остановить AFT-F4
, закрывая только значок (и его меню) в трее.
private void myMenuTray_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.Menu && e.KeyValue == 18 && e.Alt)
{
MessageBox.Show("");
MessageBox.Show("YOU CAN'T CLOSE HERE WITH ALT-F4");
return;
}
}
Я знаю, это выглядит ужасно.Но это работает отлично.Вы можете использовать какой-нибудь вопрос подтверждения, чтобы выглядеть лучше.
Пояснения: в любом случае ALT-F4
прибывает на объект уведомления.Так как в вашем коде у вас есть 1-й MessageBox
, ALT-F4
захватывается этим MessageBox
, который немедленно закрывается.2-й MessageBox
показан, следовательно, объект уведомления не закрывается.
Я протестировал один return
(и там нет e.Cancel
), но каждый раз объект уведомлениязакрыто, пока остальная часть приложения все еще находится в запущенных процессах.
Другой хороший момент заключается в том, что вы все еще можете правильно работать со стандартным ALT-F4
, чтобы закрыть приложение (если его нет в трее!)