2011-08-18 93 views
1

爲什麼我啓動Windows窗體時,系統托盤中沒有顯示通知圖標?
這是我正在做的。
我有一個Windows服務,它啓動我的托盤應用程序,這是一個Windows窗體應用程序(我使用模擬在當前用戶的上下文中啓動該應用程序)。 在托盤應用程序中,我啓動了一個包含通知圖標的表單。
這裏的問題是,有時通知圖標不會出現在系統托盤中,我無法找出原因。
在窗體的OnLoad方法中,我將窗體的visible屬性設置爲false。 另外我正在做一些遠程服務調用(如ipc)。那是問題嗎?
如何讓我的通知圖標始終出現在系統托盤中?
編輯:這裏是的OnLoad功能
通知圖標未顯示在托盤C#winforms中

protected override void OnLoad(System.EventArgs e) 
{ 
    this.Visible = false; 
    //Get some value from registry 
    CheckForStealthMode(); 
    GetLoginType(); 
    bool GetProbeStatus = false; 
    ServiceActivityInterface remoteMethods = null; 
    do 
    { 
     try 
     { 
      remoteMethods = (ServiceActivityInterface)Activator.GetObject(typeof(ServiceActivityInterface), "tcp://localhost:18800/ServiceRemoting); 
      ProbeStatus = remoteMethods.GetProbeStatus(); 
      GetProbeStatus = true; 
     } 
     catch (Exception exception) 
     { 
      GetProbeStatus = false; 
      log.Error("Exception while getting the status of Probe:" + exception.Message); 
     } 
     finally 
     { 
      remoteMethods = null; 
      if (!GetProbeStatus) 
      { 
       Thread.Sleep(5000); 
       log.Debug("Retrying to get the probe status."); 
      } 
     } 
    } while (!GetProbeStatus); 
} 
+1

你可以在你的OnLoad方法中分享代碼嗎? –

+0

只是托盤圖標沒有顯示出來,或者是其他任何操作都無法按預期運行?您是否檢查過Windows事件查看器,以查看應用程序事件日誌(甚至安全日誌)中是否有任何報告? –

+0

@ Ben Scott我發佈了問題中的代碼。 – Prasad

回答

0

代碼現在我會建議身邊的通知圖標代碼或其他條件語句幾個斷點發現,如果事情沒有被調用。嘗試並找到一致的複製方式,以幫助您診斷正在發生的事情。我有過奇怪的往事,其中最混亂的是一個鏈接到定時事件

我也建議(這可能會解決您的問題,如果它確實涉及Thread.Sleep方法,這是不理想的。用戶只是得到一個凍結的用戶界面,使用其中一個計時器類,並拿起勾號或經過的事件,以便用戶可以繼續,但你仍然可以得到延遲後你。

+0

我已經在我的問題中發佈了代碼 – Prasad

+0

嗯,好吧,我仍然會沿着斷點視圖前進,主要目標有或沒有這些,以建立一個複製品,您可以用相同的結果重複。這可能是您需要黑客或其他錯誤順序控制的錯誤,或者是代碼中的問題。斷點是我通常嘗試建立的方式。 – Coops

0

看看你的OnLoad方法,你已經有一個潛在的無限循環,每5秒只能執行一次,如果有任何懷疑拋出異常,並記錄異常然後拋棄。當你阻止UI線程,並最有可能阻止通知圖標顯示。看看Activator.GetObject或RPC GetProbeStatus調用,並考慮將RPC代碼移到另一個線程以避免阻塞UI。

+1

是的,你是正確的RPC阻止UI線程我已經轉移到新的線程。但即使在那之後,我也遇到了同樣的問題。我只是通過將通知圖標的可見屬性設置爲false來發現臨時解決方案,然後再次變爲真實,奇怪但適用於我。 – Prasad