如果您在通知图标上单击或右键单击,如何获得不同的上下文菜单?

6

我有一个应用程序,它基于系统托盘。如果您右键单击它,我有一个漂亮的上下文菜单,但是如果您左键单击它,我希望显示不同的上下文菜单。目前,我使用以下方法显示不同的菜单:

private void niTrayIcon_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        cmsTrayLeftClick.Show(Cursor.Position);
    }

}

这会使菜单出现,但是点击菜单外部不会让它消失,唯一的方法是要么点击其中一项,要么右键单击托盘图标。

我也想到了这个黑客方法,但感觉这不是正确的做法。

private void niTrayIcon_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        niTrayIcon.ContextMenuStrip = cmsTrayLeftClick;
        MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
        mi.Invoke(niTrayIcon, null);
        niTrayIcon.ContextMenuStrip = cmsTrayRtClick;
    }
}

这是正确的方法吗?还是有更加优雅的方式呢?

1个回答

8

由于没有其他人发布可行的方式,我猜正确的做法是:

private void niTrayIcon_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        niTrayIcon.ContextMenuStrip = cmsTrayLeftClick;
        MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
        mi.Invoke(niTrayIcon, null);
        niTrayIcon.ContextMenuStrip = cmsTrayRtClick;
    }
}

你的解决方案非常有效,而且还帮我解决了其他一些问题:当我点击通知图标时,我的上下文菜单栏距离鼠标指针太远了。现在完全对齐了。 - FrenkyB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接