调用NotifyIcon的上下文菜单

我想这样左键单击NotifyIcon也会导致上下文菜单(使用ContextMenuStrip属性设置)也打开。 我将如何实现这一目标? 我必须处理点击,并找出自己的位置?
编辑:显示菜单与trayIcon.ContextMenuStrip.Show()结果是一些不受欢迎的行为:

菜单不显示在相同的位置,就好像右键单击NotifyIcon(看起来,不能将x和y坐标设置到任务栏所在的位置,至less在Windows 7上是我正在运行的位置)。 它会出现在任务栏上方(不是那么重要,但一致性会很好)。

当显示菜单时,有一个额外的图标添加到任务栏。

点击菜单以外的地方不会closures它(如果你右键点击调出上下文菜单,点击其他地方自动closures上下文菜单)。

完全可以调用菜单,但内置的右键单击处理程序正在做这件事吗?

您通常会处理MouseClick事件以检测点击并调用ContextMenuStrip.Show()方法:

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

但是,这实际上并没有正常工作,CMS不会closures,当你点击它之外。 根本问题是这个知识库文章中描述的Windows怪癖(又名“bug”)。

在你自己的代码中调用这个解决方法是相当痛苦的,这个问题是令人不快的。 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); } } 

如果您处理MouseUp而不是Click,则可以分辨哪个button被点击,以及点击的位置 。 您可以使用此位置作为显示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); } 

使用下面的代码来显示右键和左键单击notifyicon上下文菜单,如果您发现任何问题,然后发短信给我在arshad_mcs786@hotmail.com(从伊斯兰堡arshad)
//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) }