2010-07-13 115 views
0

我與Windows Server 2003(和2008)和C#工作,我有一個桌面系統托盤的問題。我做了一個磁盤管理應用程序,當應用程序啓動時,它從任務欄隱藏自己並在系統托盤中添加一個圖標。當我點擊這個圖標(在系統托盤中)時,會顯示該應用程序的表單。在Windows服務器中的系統托盤圖標的問題

我已經在系統調度程序中創建了一個任務,以在特定時間自動執行應用程序,如果我在應用程序午餐時(從調度程序)登錄服務器,圖標出現在系統的系統托盤中桌面。但是,如果我沒有登錄服務器和計劃程序午餐我的應用程序,當我登錄時,我無法看到系統托盤中的圖標,但我的應用程序工作完美。

我嘗試了不同的方式來顯示應用程序的形式,例如,應用程序在文件中讀取一個標誌,當標誌爲true時,它會強制form.Show()但不起作用。

我想我必須在桌面載入時嚮應用程序表單提交資源管理器(進程),但我不知道這是怎麼回事。這是正確的方式?我在等你的建議。

問候

回答

2

我想,這是由於這樣的事實,當沒有人登錄,沒有桌面會話來運行應用程序。

即使應用程序可以正常工作,這是沒有在稍後登錄的用戶下運行,所以您看不到該圖標。它作爲一個不同的用戶在後臺運行。

這與使用遠程桌面登錄兩個用戶時效果相同。可以啓動一個創建系統托盤圖標的應用程序,另一個用戶將看不到該圖標。

另一種方法是將應用程序的邏輯放入一個windows服務中。然後,我會創建一個客戶端,在用戶登錄時自動運行,檢查服務當前是否處於活動狀態並顯示圖標和表單。

1

當您的應用程序在您未登錄的情況下啓動時,沒有桌面環境,因此您的代碼顯示系統托盤上的圖標本質上「失敗」 - 發送到站點圖標的消息已發送,但是沒有聽到他們,當然也沒有人在看。

當您隨後登錄並創建桌面環境時,您的應用程序已在運行,並且無法知道(但)現在有一個可見的桌面來註冊該圖標。它在開始時進行了圖標註冊,並且就其所擔心的部分工作完成而言。

因此,您需要一種方式來告訴應用程序您正在使用桌面和系統托盤以準備好其中的圖標,然後應用程序需要重複圖標註冊過程。如果您不想通過創建服務/客戶端安排將核心邏輯與表示層分開,則可以將您的應用程序放在啓動組中,以便在您登錄時運行。

您不希望兩個副本運行,因此可以調整應用程序以檢查其自身的其他實例,以及是否有其他實例將焦點切換到自己並自殺。然後,在焦點處理程序中,禁用並重新啓用圖標托盤註冊以重新發送這些消息。