2011-12-19 4 views
0

Windows UI의 알림 영역에 아이콘을 배치하는 응용 프로그램에 대한 플러그인 (System.ComponentModel.Composition 사용)에서 작업 중입니다. 내가 그 아이콘의 컨텍스트 메뉴에서 항목을 클릭하면 NotifyIcon에 연결된 ContextMenu에서 지연된 클릭 이벤트

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 핸들러가 호출되지 않습니다.
흥미롭게도 메뉴 항목을 클릭 한 후 아이콘을 다시 마우스 오른쪽 단추로 클릭하면 이전에 클릭 한 MenuItem에 대한 Click 처리기가 호출됩니다. 아이콘을 마우스 왼쪽 버튼으로 클릭하거나 마우스를 가져 가면이 단계가 실행되지 않습니다.

무슨 일입니까?

업데이트 : 내 문제는 this question과 관련되어 있다고 느낍니다. 그러나 나는 아직도 그것을 나의 플러그인/어플리케이션에 어떻게 적용 할 수 있는지 알아 내려고 노력 중이다.

+0

직접 컨텍스트 메뉴를 표시하는 것과 같은 특별한 작업을 수행합니까? 메뉴 바깥 쪽을 클릭하면 사라지게됩니까? –

+0

@ 한스 패 션트 : 아니오, 저는 이상한 일을하고 있다고 생각하지 않습니다. 메뉴 열기는 NotifyIcon에 의해 처리됩니다. 메뉴 바깥 쪽을 클릭하면 예상대로 사라집니다. –

답변

0

나의 이해에 문제는 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 
    } 
} 

잘 작동하는 것 같습니다.