Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Вызов этого обходного пути в вашем собственном коде довольно болезненен, pinvoke неприятен. Класс NotifyIcon имеет это обходное решение в своем методе ShowContextMenu(), с ним просто трудно добраться, поскольку это частный метод. Отражение может обойти это ограничение. Я обнаружил этот взлом 5 лет назад, и никто еще не сообщал о проблеме с ним. Задайте свойство NFI ContextMenuStrip и реализуйте событие 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);
      }
    }

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

используйте следующий код, чтобы отобразить контекстное меню справа и слева, нажмите на notifyicon, если вы найдете какую-либо проблему, а затем напишите мне на [email protected](arshad from Islamabd)
//System.Runtime.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)
    }