2009-10-28 51 views
0

我在嘗試(使用.NET的WinForms)Vista服務:可以在隱形桌面上顯示錶單嗎?

顯然形式就不會顯示在控制檯的用戶,因爲服務是在會話隔離,以顯示從Vista中的服務的形式0

然而實驗是看是否有可能「顯示」一個不可見的窗體並獲得一個窗口句柄&消息循環

我試過了,但是當我發出form.Show()時,只有form.Load事件觸發不了.Shown或.FormClosing

有什麼方法可以捕獲windo ws消息以這種方式作爲用戶應用程序?

我還沒有試圖使服務'交互式',因爲我不想與登錄用戶進行交互。

回答

0

是的,你可以在服務的桌面上顯示一個表單。它不會顯示給任何登錄用戶,實際上在Vista和後來的操作系統中,即使將服務設置爲「交互式」,也無法將其顯示給用戶。由於桌面不是交互式的,窗體收到的窗口消息會略有不同,但絕大多數事件應該在服務中被觸發,就像在交互式桌面上一樣(我只是做了一個快速測試並獲得了表單加載,顯示,激活和關閉事件)。

要記住的一件事是,爲了顯示錶單,您的線程必須是STA線程,並且必須創建消息循環,可以通過調用ShowDialog或Applicaton.Run。此外,記住與表單的所有外部交互將需要使用窗體實例上的Invoke或BeginInvoke封送到正確的線程。

這當然是非常可行的,但真的不推薦。在任何情況下,您必須絕對確保表單及其包含的任何組件不會顯示任何意外的UI,例如消息框。唯一一次這種方法可以證明是合理的,當你正在處理一個可疑的質量傳統或第三方工具時,需要創建句柄才能正常工作。

+0

非常感謝。你是如何在考試中開始表格的? 我試過ShowDialog(),但得到了 >> 'System.InvalidOperationException'當應用程序未在UserInteractive模式下運行時,顯示模態對話框或窗體不是有效的操作。指定ServiceNotification或DefaultDesktopOnly樣式以顯示來自服務應用程序的通知。 << 我想顯示這個(隱藏)窗口並獲取消息,試圖在系統關閉時嘗試處理服務中的WM_QUERYENDSESSION - 嘗試取消關機並結合ShutdownBlockReasonCreate – 2009-10-29 23:20:24

+0

我在我的Application.Run中使用了測試和工作正常。 ShowDialog用於正常工作,但顯然他們在2.0框架中添加了一個檢查來禁止它。就我個人而言,我認爲從服務中取消關機並不是一個好主意,但如果你真的想這樣做,它應該可以工作。只需調用Application.Run(myFormInstance)而不是myFormInstance.ShowDialog。 – 2009-10-30 15:44:59

相關問題