Как получить функциональность панели задач БЕЗ использования NotifyIcon.ContextMenu? - PullRequest
0 голосов
/ 04 октября 2009

Я пытаюсь заставить мое приложение отображать всплывающее контекстное меню, когда пользователь щелкает правой кнопкой мыши мой значок уведомлений в системном трее ... но есть поворот.

Мне известно, что класс 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.

Ответы [ 2 ]

3 голосов
/ 04 октября 2009

Используйте свойство ContextMenuStrip вместо ContextMenu. Класс ContextMenuStrip имеет событие Opening, которое можно отменить, установив e.Cancel = true. Таким образом, вам не нужно беспокоиться о расположении меню, поскольку оно автоматически обрабатывается

0 голосов
/ 10 октября 2009

Хорошо, мне не удалось получить ту функциональность, которую я хотел, как я описал в первоначальном вопросе, но мне удалось найти способ добиться желаемого эффекта, используя другой метод.

Я прикрепляю ContextMenu к свойству trayIcon.ContextMenu, но я присоединяю код обработчика событий к свойству Popup самого контекстного меню. Если в этом обработчике я .Clear ContextMenu, он на самом деле вообще не появляется, что позволяет моему коду выбирать, чтобы эффективно запретить показ всплывающего меню в Traiconon, если он этого хочет. Это был эффект, которого я хотел достичь. Если вместо этого я заполняю ContextMenu в коде обработчика событий Popup, как обычно появляется всплывающее меню, содержащее то, чем я его заполнил.

Тааак, мне удалось решить проблему другим способом. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...