如何将ContextMenuStrip附加到NotifyIcon

Ant*_*060 3 .net vb.net notifyicon contextmenustrip

我正在尝试NotifyIcon显示一个上下文菜单,即使用鼠标左键单击它也是如此.我可以在图标的MouseDown事件中将其显示在正确的位置:

sysTrayIcon.ContextMenuStrip = TrayContextMenu
If e.Button = MouseButtons.Left Then TrayContextMenu.Show()
Run Code Online (Sandbox Code Playgroud)

但是因为sysTrayIcon当我左键单击时未指定为控件,如果我在菜单外单击或按下转义,则不会从屏幕上清除.

我知道通常的方法是使用菜单的重载Show(control, location)方法,但这引发了这个错误:

Value of type 'System.Windows.Forms.NotifyIcon' cannot be converted to 'System.Windows.Forms.Control'.
Run Code Online (Sandbox Code Playgroud)

那么如何将菜单附加到通知图标呢?

Han*_*ant 6

是的,此代码无法正常发布.需要几个秘密咒语才能将上下文菜单放在正确的位置,并正确设置鼠标捕获,以便在其外部单击可正常工作.这些咒语是必需的,因为它是管理通知图标的Windows资源管理器,而不是您的程序.

你需要将它留给NotifyIcon类才能做到这一点.然而,一个重要的挂起是它不公开显示上下文菜单的方法,它是一个私有方法.您唯一能做的就是使用Reflection来调用该方法.像这样(使用默认名称):

Imports System.Reflection
...
    Private Sub NotifyIcon1_MouseDown(sender As Object, e As MouseEventArgs) Handles NotifyIcon1.MouseDown
        NotifyIcon1.ContextMenuStrip = ContextMenuStrip1
        Dim mi = GetType(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.NonPublic Or BindingFlags.Instance)
        mi.Invoke(NotifyIcon1, Nothing)
    End Sub
Run Code Online (Sandbox Code Playgroud)