Как получить другое контекстное меню, если вы нажмете Lt-Click или Rt-Click на значок уведомления? - PullRequest
6 голосов
/ 23 сентября 2010

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

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

}

. Это заставляет меню отображаться, но если щелкнуть по меню, оно не исчезнет, ​​единственный способ заставить меню исчезнуть - это нажать наitem или rt нажмите на иконку в трее.

Я также придумал этот хак, но мне кажется, что это правильный способ сделать это.

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 Ответ

7 голосов
/ 24 сентября 2010

Поскольку никто не опубликовал способ, который работает, я думаю, правильный способ сделать это -

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;
    }
}
...