2013-12-10 48 views
2

我一直在研究Windows XP的應用程序,該應用程序需要在啓動時使用管理級別權限同時啓動Windows,所以我繼續添加並添加該exe使用任務計劃程序「在系統啓動時運行」。計劃啓動C#應用程序無法顯示已登錄用戶的表單

在任何給定的時間都不應該有超過一個應用程序實例運行。理想情況下,應用程序將在Windows啓動時啓動,然後無論用戶是登錄還是用戶在一天中註銷並登錄,我的應用程序將始終在後臺運行。這樣,即使用戶使用「快速用戶切換」進行切換,我的應用程序仍將保持從用戶到用戶的運行狀態。

所有這一切似乎都正確地工作到一個點。然而,偶爾我的應用程序需要顯示一個表單或以某種方式與用戶交互,這是它破壞的地方。表單不顯示(儘管我相信它們正在運行)。如果我使用Process類並嘗試執行程序,它們在任務管理器中顯示爲正在運行,但實際上並未顯示。他們在檢查過程中沒有列出Process Hacker中的任何句柄。這就像他們只是在後臺默默地運行。

由於多種原因,我不能只是將任務更改爲在用戶登錄時運行。一,我很確定我將不得不將計劃任務添加到每個用戶。二,應該只運行這個程序的一個實例,如果有人使用快速用戶切換,那麼恐怕有兩個程序實例會運行。即使我發現一個實例已經運行,它也不能解決問題,因爲用戶#1的實例#1無法顯示用戶#2的窗體/窗口(我不認爲,如果我是)

理想情況下,我想保持它在系統啓動時運行,並找出爲什麼我不能顯示任何窗口。

有關該程序的一些注意事項,它首次啓動時不會顯示任何內容。它創建了一個形式

WndHidden wnd = new WndHidden() 

但隨後只運行Application.Run()而不經過形式,然後只是等待某些系統提示,用於當顯示形式/消息給用戶。

我在做什麼錯?

+0

可能會有所幫助:http://serverfault.com/questions/458848/can-i-schedule-a-windows-task-to-run-in-an-interactive-desktop-session – inquisitive

+0

在哪個用戶帳戶下EXE運行? – Kurubaran

+0

它作爲「AdminUser」運行,它是計算機上的唯一管理員帳戶,其他人都是有限的用戶。 – zoombini

回答

2

其實你在這裏有一個相當的情況。您希望您的進程在啓動時運行,即使沒有用戶登錄也需要進程在屏幕上顯示錶單。現在有衝突!表單可以顯示在某些登錄用戶的桌面上。沒有用戶 - 沒有桌面 - 沒有窗體。

每個進程都屬於某個用戶。如果沒有用戶登錄,則該進程屬於SYSTEM。每個用戶都有自己的桌面。登錄的用戶有一個真實的桌面,SYSTEM有一個虛擬桌面。所以,你的表格正在顯示,但不是在真實的桌面上,而是在虛擬桌面上。因此你看不到它。

一個進程不能干涉其他用戶的桌面。因此您的流程無法在其他用戶或通過快速切換登錄的用戶上顯示錶單。

如果您忘記了快速用戶切換部分並只滿足一個用戶,那麼在安排時可以指定特定用戶的憑證。這樣你就可以得到你想要的東西,除了多用戶場景。但要小心,如果用戶更改密碼,則計劃的任務將中斷。你必須重新安排它。


你想要的是大多數反病毒軟件顯示的行爲。您需要可執行文件。 (它可以用一個exe文件完成,但讓我們不要使事情複雜化)使任何用戶登錄前在啓動時運行第一個進程。使用通常的SYSTEM帳戶運行它。如果可能的話,將進程註冊爲Windows服務,而不是計劃任務。不要在過程中放置​​任何用戶界面邏輯。

將所有UI邏輯放入第二個可執行文件中。註冊第二個可執行文件以在每個用戶啓動時運行。事先不要顯示任何表格。最好製作一個托盤圖標項目。躺在每個用戶的桌面上休眠。

您的主進程是單一且獨立於用戶的。每個用戶從屬進程持有UI。訣竅是將信號從主機傳遞到相應的從機。建立一個通信媒介,一種IPC(進程間通信)。當奴隸上線時,主人會收到通知。主人甚至可以選擇要求顯示錶格的哪個奴隸(用戶)。即使多個用戶通過遠程桌面同時登錄,該機制也能正常工作。


對於IPC,您可以從廣泛的範圍內進行選擇。選項有:1. TCP/IP,2.命名管道,3. WCF(tcp/named-pipe),4.遠程處理。

如果上面的名字不熟悉,那麼我建議使用普通的TCP/IP,但儘可能快地嘗試升級到WCF的通信。

你試圖完成的事情實際上比看起來複雜得多。在XP中這很容易,但這就是爲什麼XP更容易受到惡意軟件和病毒,然後Vista +。隨時再問一次。

+0

+1好解釋 – Kurubaran

+0

感謝好奇,爲了提供澄清,現在該過程以Admin身份運行,因爲這些是通過任務計劃程序分配的憑據。如果我將該程序重新編寫爲服務,該怎麼辦?它會限制它只運行一個實例,並能顯示錶單嗎? – zoombini

+0

作爲服務,它將作爲單個實例運行,但不包含表單。儘管服務*可以被用來呈現表單,但實際上它永遠不會有幫助。 1-service-* n * -user-agents是一個長期但最靈活和穩定的解決方案。 – inquisitive

相關問題