Вызвать контекстное меню NotifyIcon

Я хочу, чтобы он был таким, что щелчок левой кнопкой мыши на NotifyIcon также вызывает открытие контекстного меню (с помощью свойства ContextMenuStrip). Как мне этого достичь? Должен ли я справиться с Click и выяснить позиционирование самостоятельно?
Edit: отображение меню с помощью trayIcon.Управления contextmenustrip.Show () results-это несколько нежелательных поведений:

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

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

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

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

4 ответов


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

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

но это на самом деле не работает должным образом, CMS не закроется, когда вы нажмете за его пределами. Основная проблема-это причуда Windows (она же "ошибка"), описанная в эта статья KB.

вызов этого обходного пути в вашем собственном коде довольно болезнен, 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);
      }
    }

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

notifyIcon.MouseUp += new MouseEventHandler(delegate(object sender, MouseEventArgs e) { contextMenu.Show(e.Location); });

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

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

void notifyIcon1_Click(object sender, EventArgs e)
 {
    contextMenuStrip1.Show(Cursor.Position);
 }

используйте следующий код, чтобы показать контекстное меню как справа, так и слева нажмите на notifyicon, если вы найдете какие-либо проблемы, то текст мне на arshad_mcs786@hotmail.com (Аршад из Исламабда)
//Система.Во время выполнения.InteropServices используют thi в качестве ссылки

    [DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
    public static extern bool SetForegroundWindow(HandleRef hWnd);

    private void notifyIcon1_Click(object sender, EventArgs e)
    {
        SetForegroundWindow(new HandleRef(this, this.Handle));
        int x = Control.MousePosition.X;
        int y = Control.MousePosition.Y;
         x = x - 10;
        y = y - 40;
        this.contextMenuStrip1.Show(x,y );
        //this.PointToClient(Cursor.Position)
    }