2014-01-12 5 views
2

Я пытаюсь сделать отображение NotifyIcon контекстного меню, даже если его щелкнули левой кнопкой мыши. Я могу получить его, чтобы отобразить в нужном месте с этим в MouseDown случае значка:Как подключить ContextMenuStrip к NotifyIcon

sysTrayIcon.ContextMenuStrip = TrayContextMenu 
If e.Button = MouseButtons.Left Then TrayContextMenu.Show() 

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

Я знаю, что обычный метод заключается в использовании перегруженного Show(control, location) метода перехода по меню, но вот повышения этой ошибки:

Value of type 'System.Windows.Forms.NotifyIcon' cannot be converted to 'System.Windows.Forms.Control'. 

Так как я могу прикрепить меню к иконке уведомления, пожалуйста?

ответ

5

Да, этот код не может работать правильно, как указано. Для получения контекстного меню в нужном месте требуется несколько secret incantations и для правильной установки захвата мыши, чтобы щелчок за его пределами работал правильно. Эти заклинания требуются, потому что именно Windows Explorer управляет значком уведомления, а не вашей программой.

Чтобы получить это право, вам нужно оставить его до класса NotifyIcon. Значительное отключение - это то, что он не раскрывает метод, отображающий контекстное меню, это метод private. Единственное, что вы можете сделать, это использовать 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 
+0

Wow! Спасибо Гансу, я бы никогда не подумал об этом сам. – Ants1060