Показывать контекстное меню NotifyIcon и управлять его положением? - PullRequest
1 голос
/ 19 марта 2010

Я пытаюсь показать контекстное меню, когда я щелкаю левой кнопкой мыши по NotifyIcon. Просто вызов NotifyIcon.ContextMenuStrip.Show () работает не очень хорошо. Здесь было опубликовано решение до , которое вызывает секретный метод с использованием Reflection:

Dim mi As System.Reflection.MethodInfo = GetType(NotifyIcon).GetMethod("ShowContextMenu", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
mi.Invoke(Icon, Nothing)

Это прекрасно работает, за исключением того, что мне также нужно контролировать , где отображается меню. Я хочу подождать, пока SystemInformation.DoubleClickTime истечет между получением события NotifyIcon.MouseUp и отображением меню, чтобы я мог обрабатывать одиночные и двойные щелчки по отдельности. Но при вызове метода ShowContextMenu меню отображается в текущей позиции мыши при вызове ShowContextMenu, а не при фактическом щелчке значка. Это означает, что если мышь перемещалась во время DoubleClickTime, меню будет отображаться в другой части экрана. Поэтому, если я могу контролировать, где отображается меню, я могу просто сохранить координаты мыши, когда получаю событие MouseUp, и затем я могу убедиться, что меню отображается рядом со значком. Есть ли способ сделать это?

Заранее спасибо.

1 Ответ

0 голосов
/ 19 марта 2010

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

Так что либо это стандартное поведение, либо это проблема, которую еще никто не смог решить. И как пользователь, я никогда не замечал такого поведения до вчерашнего дня, когда я тестировал свое собственное приложение. Так что я думаю, что это не так уж важно, и я не буду об этом беспокоиться.

...