Я просто хочу заменить кнопку панели задач моего приложения winforms значком уведомлений в трее. Это означает, что если пользователь щелкнул левой кнопкой мыши по значку, форма должна быть активирована, если она не была сфокусирована, иначе сведена к минимуму или скрыта.Правильный способ активации моего MainForm из NotifyIcon, если он не был сфокусирован уже
Я прочитал много статей о правильном использовании NotifyIcon
, и, похоже, я должен принять хакерское решение. Итак, что самое подходящее?
Я получил его в основном для запуска, но теперь я застрял в обнаружении, если моя форма уже активна, потому что при нажатии на значок форма теряет фокус, поэтому я не могу проверить свойство Focused
.
Следующий код еще не решил это, поэтому, если форма была просто скрыта другими окнами, вам нужно нажать 2 раза, потому что первый клик сводит к минимуму.
Как его можно улучшить?
private void FormMain_Resize(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Minimized)
Hide();
}
private void notifyIcon_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
if (WindowState == FormWindowState.Minimized) {
WindowState = FormWindowState.Normal;
Show();
Activate();
}
else {
Hide();
WindowState = FormWindowState.Minimized;
}
}
(я тоже не понимаю, почему Click
событие срабатывает на правой кнопкой мыши, который уже открывает контекстное меню, в моем случае ...)
(И, конечно, было бы неплохо имеют правильную минимизацию анимации, но есть и другие вопросы здесь, где это не было действительно решено)
(Я знаю, что я сказал Focused
, но если форма уже была полностью видимой (но, возможно, не сфокусированной), а пользователь щелкает значок в трее, он, скорее всего, захочет его скрыть)
Вам нужно будет прибегнуть к хакам с момента, когда вы нажмете на NotifyIcon, ваша форма будет деактивирована. Множество хаков, пытающихся запустить таймер в событии MouseMove и попытаться создать событие MouseLeave, связанное с этим значком, но ни один из них не является надежным, потому что окна не предоставляют границы прямоугольника вашего значка. – LarsTech
@LarsTech, тогда, может быть, лучше начать таймер при дезактивации формы ... Но мне это не понравится. –