簡體   English   中英

Windows服務中是否允許Windows GUI調用(創建可見窗口等)?

[英]Are Windows-GUI calls (creating visible windows, etc.) allowed in a Windows-Service?

首先,我知道制作真正的交互式Windows服務的一些正確方法

情況是,我確實有一個與用戶交互的工具。 但是,它確實通過彈出窗口和Windows通知區域(也稱為系統托盤) 顯示 非阻塞通知。 它還會寫入顯示的通知的日志文件。

該工具通常由主用戶應用程序產生,並且只要主應用程序是普通應用程序,這些通知就可以正常工作。

Windows服務生成此工具時,自然不會顯示任何通知。 (該服務的桌面會話不可見。)但這可以,我們有日志文件,這些通知只是-通知,用戶在任何情況下都絕對看不到。

現在的問題是: 是否 “允許”在Service 上下文中運行的進程 (Service本身或其啟動的任何進程) 進行顯示可見GUI的Windows API調用?

  • 在服務的不可見會話中,大多數Windows API調用(例如,使用Shell_NotifyIcon等創建和顯示窗口)是否會表現相同?
  • 還是我必須確保在整個源代碼中,在服務的上下文中沒有調用顯示或修改內容的GUI?

是的,調用:: MessageBox是一個壞主意,因為它將阻止。 但我可以處理這些電話。

是的,可以設計得更好,但這是我目前所擁有的,如果我不把整個工具拆開以確保在服務中沒有運行與GUI相關的代碼,那就太好了。

Windows服務中的GUI元素顯示在會話0中。在Windows XP和2003中,允許用戶登錄到會話0並正常地與服務創建的窗口進行交互,但是Microsoft將刀刃放在了交互服務的中心通過隔離Session 0來實現 Vista(及以后)。

因此,回答您的特定問題:

是否允許在服務上下文中運行的進程(服務本身或其啟動的任何進程)允許顯示可見GUI的Windows API調用? 在服務的不可見會話中,大多數Windows API調用(例如,使用Shell_NotifyIcon等創建和顯示窗口)是否會表現相同?

是的,允許進行GUI調用,並且應該正常進行。 我知道的唯一值得注意的例外是與任務欄圖標相關的例外,因為提供任務欄(explorer.exe)的進程未在隔離的Session 0中運行。

還是我必須確保在整個源代碼中,在服務的上下文中沒有調用顯示或修改內容的GUI?

盡管您應該謹慎進行服務中的任何GUI交互 ,但這並不是必須的。 徹底測試!

我想提供一些信息。 Raymonds Chen對其他答案的評論

您應該避免在服務中顯示UI,因為您可能會觸發UI檢測服務,這會暫時將用戶切換到您的服務UI。 –雷蒙·陳(Raymond Chen)

我發現這些好文章:

在哪里可以找到關於UI檢測服務UI0Detect )是什么,做什么以及應該如何工作的解釋。

交互式服務檢測(任務欄上的閃爍按鈕)是對舊版應用程序的緩解,該舊版應用程序可以檢測服務是否正在嘗試與桌面進行交互。 這由交互式服務檢測(UI0Detect)服務處理。

然而,我們必須注意,這只能工作,如果正試圖查看GUI的服務具有標志“允許服務與桌面交互”設置,因為只有這樣的服務過程將在運行WinSta0Session0甚至允許其顯示任何東西。

Alex Ionescu提到了這一點:

如果UI0Detect.exe ... SCM已根據窗口掛鈎DLL的要求啟動了它。 該服務將繼續進行...該服務首先進行一些驗證,以確保它在正確的WinSta0\\Default windowstation和桌面上運行,然后通知SCM成功或失敗。

因此,請回到Raymond的評論:據我所知,只要服務沒有勾選type= interact選項( 請參見sc.exe ),並且通常您不勾選此項,UI0Detect服務就不會什么也不要做,觸發它也不應該有任何“危險”。


注意:上面的信息是基於我有限的研究和測試,僅在一台Windows 7 PC上進行的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM