2010-02-05 4 views
36

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

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

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

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

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

ответ

82

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

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

Но это Безразлично Фактически, работа выполняется правильно, CMS не будет закрываться, когда вы нажимаете на нее. Основная проблема - это quirk Windows (он же «ошибка»), который описан в this KB article.

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

@msorens - не поздно редактировать :) Есть еще несколько уловок, чтобы решить обходной путь ApplicationContext. Найдите ответы на SetVisibleCore. –

+0

Это решение не использует возможность назначить свойство 'NotifyIcon'' menu' объекту ContextMenuStrip; и поэтому он делает чрезмерно уродливый взлом, чтобы решить проблему, которая не должна возникать в первую очередь. Дополнительную информацию см. На странице http://stackoverflow.com/questions/132612/show-a-contextmenustrip-without-it-showing-in-the-taskbar. –

+5

Это полная чепуха. –

2

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

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

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

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

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

использовать следующий код, чтобы показать контекстное меню на правой и левой кнопкой мыши на NotifyIcon, если вы обнаружите какие-либо проблемы, то напиши мне на arshad_mcs786 @ Hotmail. ком (Аршад из Islamabd)
//System.Runtime.InteropServices использовать Тхи в качестве ссылки

[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) 
    } 
Смежные вопросы