Показать контекстное меню значка уведомления после выполнения какого-либо действия

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

Он отлично работает для щелчка левой кнопкой мыши как:

sysTrayIcon.MouseClick += OnSysTrayClicked;

private static void OnSysTrayClicked(Object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        PerformActions();
        MethodInfo oMethodInfo = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
        oMethodInfo.Invoke(sysTrayIcon, null);
    }
}

Но щелчок правой кнопкой мыши по-прежнему обрабатывается автоматически, и соответствующий ContextMenuStrip отображается при щелчке правой кнопкой мыши. Есть ли способ переопределить это с помощью моего обработчика событий?


person sohil    schedule 15.01.2013    source источник


Ответы (1)


Есть два варианта.

Вариант A: не назначать контекстное меню для this.ContextMenuStrip. Откройте контекстное меню вручную, когда захотите. Имейте в виду, что strip.Top и strip.Left должны быть абсолютными координатами экрана.

Вариант B: отменить назначение this.ContextMenuStrip OnMouseDown, если нажата правая кнопка мыши, и переназначить OnMouseUp. См. этот пример.

person Matthias    schedule 15.01.2013
comment
Пробовал вариант Б. Он работал отлично. Спасибо! PS: Вы знаете, как Windows автоматически показывает контекстное меню? Разве он не должен проверять и пытаться отобразить контекстное меню после самого MouseUp? - person sohil; 15.01.2013
comment
Насколько я знаю, он перехватывает щелчок правой кнопкой мыши и затем вызывает contextMenu.Show(...). Нет никакого способа подключиться между ними. Обычно вы можете подключиться к contextMenu.Opening и установить для args.Cancel значение true, если вы не хотите, чтобы меню отображалось. - person Matthias; 15.01.2013