Вызовите NotifyIcon's Context Menu

Я хочу иметь его таким образом, что щелчок левой кнопкой по NotifyIcon также заставляет контекстное меню (набор со свойством ContextMenuStrip) открываться также. Как я достиг бы этого? Я должен обработать Щелчок и выяснить расположение меня?
Править: показ меню с trayIcon. ContextMenuStrip. Покажите (), результатами являются несколько нежелательных поведений:

Меню не показывают в том же местоположении, как будто щелкают правой кнопкой по NotifyIcon (кажется, что Вы не можете установить провода X и Y туда, где панель задач, по крайней мере, в Windows 7, который является тем, что я выполняю). Это появится выше панели задач (не настолько большой из соглашения, но непротиворечивость была бы хороша).

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

Нажатие где-нибудь кроме меню не закрывает его (тогда как, если Вы щелкаете правой кнопкой для перевода в рабочее состояние контекстного меню еще, нажимающего, где автоматически закрывает контекстное меню).

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

40
задан GEOCHET 6 September 2012 в 21:18
поделиться

3 ответа

Обычно вы обрабатываете событие MouseClick, чтобы обнаружить щелчок и вызвать метод ContextMenuStrip.Show ():

    private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) {
        contextMenuStrip1.Show(Control.MousePosition);
    }

Но на самом деле это не работает должным образом, CMS не закрывается, когда вы щелкаете вне его. Основная проблема - это особенность Windows (также известная как «ошибка»), которая описана в этой статье базы знаний .

Вызов этого обходного пути в вашем собственном коде довольно болезненен, pinvoke неприятен. У класса NotifyIcon есть этот обходной путь в его методе ShowContextMenu () , они просто затруднили доступ, поскольку это частный метод. Отражение может обойти это ограничение. Я обнаружил этот хак 5 лет назад, и пока никто не сообщил о проблемах с ним. Задайте свойство ContextMenuStrip NFI и реализуйте событие MouseUp следующим образом:

using System.Reflection;
...
    private void notifyIcon1_MouseUp(object sender, MouseEventArgs e) {
      if (e.Button == MouseButtons.Left) {
        MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
        mi.Invoke(notifyIcon1, null);
      }
    }
85
ответ дан 27 November 2019 в 01:24
поделиться

Если вы работаете с MouseUp, а не с Click, вы сможете определить, какая кнопка была нажата, а также место нажатия . Вы можете использовать это место в качестве места для отображения ContextMenu

notifyIcon.MouseUp += new MouseEventHandler(delegate(object sender, MouseEventArgs e) { contextMenu.Show(e.Location); });
2
ответ дан 27 November 2019 в 01:24
поделиться

Вы можете подключить событие onClick для значка уведомления, а затем вызвать шоу при нажатии

private void wire()
{
     notifyIcon1.Click += new EventHandler(notifyIcon1_Click);
}

void notifyIcon1_Click(object sender, EventArgs e)
 {
    contextMenuStrip1.Show(Cursor.Position);
 }
2
ответ дан 27 November 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: