Я пытаюсь заставить мое приложение отображать всплывающее контекстное меню, когда пользователь щелкает правой кнопкой мыши мой значок уведомлений в системном трее ... но есть поворот.
Мне известно, что класс NotifyIcon, который я использую для получения значка в системном трее, имеет свойство ContextMenu. Я не хочу использовать это, чтобы получить всплывающее меню, вызываемое правой кнопкой мыши, потому что оно ВСЕГДА отображает всплывающее меню, вызываемое правой кнопкой мыши, и больше ничего не делает. Когда моя основная форма отображает модальное диалоговое окно, я хочу щелкнуть правой кнопкой мыши, чтобы активировать основную форму, а НЕ отображать всплывающее меню.
Итак, я предполагаю, что мне нужно использовать событие NotifyIcon.MouseClick и вручную открыть меню в этом событии? Вот где я до сих пор:
private NotifyIcon trayIcon;
private ContextMenu iconMenu;
private void frmMain_Load(object sender, EventArgs e) {
// [...]
this.trayIcon.MouseClick += new MouseEventHandler(trayIcon_MouseClick);
iconMenu = new ContextMenu();
// [...]
}
private void trayIcon_MouseClick(object sender, MouseEventArgs ea) {
this.iconMenu.Show(Program.instanceFrmMain, new Point(System.Windows.Forms.Cursor.Position.X - Program.instanceFrmMain.Left, System.Windows.Forms.Cursor.Position.Y - Program.instanceFrmMain.Top));
}
Обратите внимание, как в iconMenu.Show, потому что он принимает всплывающие координаты относительно родительского элемента управления (моя основная форма здесь), мне досадно приходится вычитать координаты родительского элемента управления из всплывающих координат, что-то, что я уже не хочу делать.
Кроме того, вот мои проблемы:
- Несмотря на то, что меню открывается по щелчку правой кнопкой мыши, оно не закрывается, если я щелкаю где-нибудь еще на экране за пределами меню - и оно должно быть.
- Меню не совсем всплывает в нужном месте; для других приложений в системном трее он появляется так, что его правый нижний или левый нижний угол находятся на кончике курсора мыши. Для меня всплывающее меню находится в нижней части экрана, рядом с курсором мыши.
Есть идеи, как мне заставить это работать лучше? Я знаю, что это возможно, многие другие приложения вручную обрабатывают отображение всплывающего меню вместо использования какого-либо свойства NotifyIcon.ContextMenu.