在附加到NotifyIcon的ContextMenu中延迟单击事件

我正在为一个应用程序的插件(使用System.ComponentModel.Composition )在Windows UI的通知区域中放置一个图标。

 trayMenu.MenuItems.Clear(); // Create context menu items foreach( IJob job in jobs ) { MenuItem menuItem = new MenuItem( job.Name ) {Tag = job}; menuItem.Click += MenuItemClick; trayMenu.MenuItems.Add( menuItem ); } private void MenuItemClick( object sender, EventArgs e ) { // ... } 

现在,当我点击该图标上下文菜单中的一个项目时, Click处理程序没有被调用。
有趣的是,当我再次右键单击图标(单击菜单项后)先前单击的MenuItemClick处理程序被调用。 左键单击或hover在图标上不会触发此步骤。

到底是怎么回事?

更新 :我有一个强烈的感觉,我的问题与这个问题有关 。 但我仍然试图找出如何将其应用到我的插件/应用程序。

Solutions Collecting From Web of "在附加到NotifyIcon的ContextMenu中延迟单击事件"

我的理解是这个问题是NotifyIcon没有处理窗口消息(或者至少没有我喜欢/需要的消息)。

我通过从Form继承并为我的插件运行另一个消息泵来解决问题。

 using System; using ... namespace JobTracker.Tray { [Export( typeof( IJobTrackerPlugin ) )] public class TrayPlugin : Form, IJobTrackerPlugin { #region Plugin Interface [Import( typeof( IJobTracker ) )] #pragma warning disable 649 private IJobTracker _host; #pragma warning restore 649 private IJobTracker Host { get { return _host; } } public void Initialize() { trayMenu = new ContextMenu(); trayMenu.MenuItems.Add( "Exit", OnExit ); trayIcon = new NotifyIcon(); trayIcon.Icon = new Icon( SystemIcons.Application, 32, 32 ); trayIcon.ContextMenu = trayMenu; // Show the proxy form to pump messages Load += TrayPluginLoad; Thread t = new Thread( () => { ShowInTaskbar = false; FormBorderStyle = FormBorderStyle.None; trayIcon.Visible = true; ShowDialog(); } ); t.Start(); } private void TrayPluginLoad( object sender, EventArgs e ) { // Hide the form Size = new Size( 0, 0 ); } #endregion private NotifyIcon trayIcon; private ContextMenu trayMenu; private void OnExit( object sender, EventArgs e ) { Application.Exit(); } #region Implementation of IDisposable // ... private void DisposeObject( bool disposing ) { if( _disposed ) { return; } if( disposing ) { // Dispose managed resources. if( InvokeRequired ) { EndInvoke( BeginInvoke( new MethodInvoker( Close ) ) ); } else { Close(); } trayIcon.Dispose(); trayMenu.Dispose(); } // Dispose unmanaged resources. _disposed = true; } #endregion } } 

似乎很好。