Я хочу иметь его таким образом, что щелчок левой кнопкой по NotifyIcon также заставляет контекстное меню (набор со свойством ContextMenuStrip) открываться также. Как я достиг бы этого? Я должен обработать Щелчок и выяснить расположение меня?
Править: показ меню с trayIcon. ContextMenuStrip. Покажите (), результатами являются несколько нежелательных поведений:
Меню не показывают в том же местоположении, как будто щелкают правой кнопкой по NotifyIcon (кажется, что Вы не можете установить провода X и Y туда, где панель задач, по крайней мере, в Windows 7, который является тем, что я выполняю). Это появится выше панели задач (не настолько большой из соглашения, но непротиворечивость была бы хороша).
В то время как меню показывают, существует дополнительный значок, добавленный к панели задач.
Нажатие где-нибудь кроме меню не закрывает его (тогда как, если Вы щелкаете правой кнопкой для перевода в рабочее состояние контекстного меню еще, нажимающего, где автоматически закрывает контекстное меню).
Вообще возможно просто вызывать меню однако, созданный в обработчике щелчков правой кнопкой делает его?
Обычно вы обрабатываете событие 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);
}
}
Если вы работаете с MouseUp, а не с Click, вы сможете определить, какая кнопка была нажата, а также место нажатия . Вы можете использовать это место в качестве места для отображения ContextMenu
notifyIcon.MouseUp += new MouseEventHandler(delegate(object sender, MouseEventArgs e) { contextMenu.Show(e.Location); });
Вы можете подключить событие onClick для значка уведомления, а затем вызвать шоу при нажатии
private void wire()
{
notifyIcon1.Click += new EventHandler(notifyIcon1_Click);
}
void notifyIcon1_Click(object sender, EventArgs e)
{
contextMenuStrip1.Show(Cursor.Position);
}