2009-10-13 53 views
3

我是新來的,開始時有一個非常神祕的問題。我是英國的軟件開發人員,擁有超過15年的經驗,但只在.NET中開發了18個月。我的NotifyIcon鼠標事件不會觸發!NotifyIcon未開火的事件

我正在使用C#編寫一個以NotifyIcon('主應用程序圖標')開頭的應用程序,並在鼠標右鍵上顯示一個ContextMenu。這工作正常:ContextMenu,表單啓動和鼠標點擊事件觸發。

微小的背景:應用程序應該感應插入USB設備(它),詢問它並創建另一個NotifyIcon('設備圖標'),以允許用戶與該設備進行交互。上一段中提到的「主應用圖標」允許用戶與數據庫交互並配置軟件。

爲了封裝這些設備交互功能,我構建了一個「設備類」,其中包含設備NotifyIcon,ContextMenu,窗體,鼠標點擊事件等,以允許與設備進行交互。

問題 當我從ManagementEventWatcher EventArrived事件實例化我的'設備類'時,問題就開始了。如果我在我的程序Main中實例化'設備類',那麼當點擊notifyicon時事件會正確啓動。

所以,請,有人可以幫助我嗎?

歡呼聲,提前

馬修

回答

2

IIRC,在事件使用(而不是WaitForNextEvent)的作品異步。我很想知道事件正在提出什麼線程。我想知道是否沒有消息泵爲您的圖標提供消息服務。

你是否有表格?或其他與消息循環的其他東西?我會試圖調用表格(使用Control.Invoke),並要求表格顯示圖標 - 從那時起它應該有一個主動消息泵。


對不起,閱讀你的評論,這聽起來像你已經廣泛得到一個解決方法。唯一的問題是交叉線程問題;理想情況下,您會要求UI在UI線程上進行的更改;例如,如果你有一個Form踢左右(擁有圖標) - 添加到您的窗體類:

// not a property, as there is no need to add a complex x-thread "get" 
public void SetIconVisible(bool isVisible) { 
    if(this.InvokeRequired) { 
     this.Invoke((MethodInvoker) delegate { 
      myIcon.Visible = isVisible; 
     }); 
    } else { 
     myIcon.Visible = isVisible; 
    } 
} 

這確實(如果需要)線程切換到UI線程。有用嗎?

+0

嗨馬克 感謝您的快速回復! 我在這方面有點太新了,能夠回答你的問題或理解建議。 有沒有什麼方法可以讓你說'消息泵'?我確實有表格,但它們只是顯示在我提到的ContextMenus的響應中。 您在第二句話中詢問了哪個事件? 乾杯 M – user188999 2009-10-13 11:38:05

+0

稍後回覆 - 工作時間... – 2009-10-13 12:09:27

+0

謝謝馬克。我的研究告訴我,我需要做一些交叉線程 - 我只能理解。關於代表和調用? hh – user188999 2009-10-13 12:24:26

0

馬克,只是讓你知道 -

我的工作了,我可以創建具有NotifyIcon的是在主線程中成員的類實例,然後使NotifyIcon的(一個或多個)可見,當USB設備( s)連接。

它需要一些調整,儘管因爲NotifyIcon是在它首次被顯示時創建的,所以我必須確保(在主線程中)將Visible設置爲true,然後對每個設置爲false,從而產生需要限制實例的數量。

當設備連接時,ManagementEventWatcher線程可以將Visible屬性設置爲true。

解決方法。

(見回覆您的意見)

+0

增加了一些想法 - 我希望它有幫助。 – 2009-10-15 11:34:14

1

所以答案是:

如果當你的NotifyIcon的可見的,你在主線程做的事件只會工作。所以Marc Gravell給出的代碼就是解決方案。