1

首先,我知道製作真正互動的Windows服務的some proper ways在Windows服務中允許Windows-GUI調用(創建可見窗口等)嗎?

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

此工具通常是由主用戶應用程序產生的,只要主應用程序是普通應用程序,這些通知就會按預期工作。

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

問題就變成:是一個過程,在「允許」服務(服務本身或啓動任何程序)的上下文中運行,以使該顯示可見GUI Windows API調用?

  • 將大多數Windows API調用(例如創建和顯示一個窗口,使用Shell_NotifyIcon等)表現在服務的無形會議一樣嗎?
  • 或者我需要確保整個源代碼中沒有GUI顯示/修改的東西在服務的上下文中調用?

是的,撥打::MessageBox是一個壞主意,因爲它會阻止。但我可以處理這些電話。

是的,這可能是更好的設計,但這是我目前所擁有的,如果我沒有撕開整個工具以確保沒有GUI相關的代碼在服務中運行,那將是很好的。

+0

傳遞句子中的提示:[GUI調用會成功,但不會顯示GUI。](http://www.brianbondy.com/blog/id/100/) –

+0

唯一的方法似乎是使用WTSEnumerateSessions和CreateProcessAsUser - 請參閱此文章[SO文章](http://stackoverflow.com/a/267866/1850797) –

+0

@EdwardClements:感謝您的鏈接。但是請注意,我不*需要在服務上下文中運行時顯示GUI元素。我只是想知道*試圖*顯示非阻塞的GUI元素是否會引起Service的問題。 –

回答

2

來自Windows服務的GUI元素顯示在會話0上。在Windows XP & 2003上,用戶被允許登錄到會話0並與服務創建的窗口正常交互,但是微軟在心臟中放了一把刀在Vista(及更高版本)中的交互式服務由isolating Session 0提供。

因此,要回答你的具體問題:

處於業務(服務本身 或啓動任何程序)的上下文中運行的進程「允許」,以使Windows API調用 顯示一個可見的GUI? 在服務的不可見會話 中,大多數Windows API調用(例如,使用Shell_NotifyIcon等創建並顯示一個窗口)的行爲是否相同?

是的,GUI調用是允許的,應該可以像平常一樣成功。我知道的唯一值得注意的例外是那些與托盤圖標相關的例外,因爲提供任務欄(explorer.exe)的進程沒有在孤立的Session 0中運行。

或者我需要確保整個源代碼中沒有GUI顯示/修改的東西在服務的上下文中調用?

這應該沒有必要,但你應該proceed cautiously with any GUI interaction from your service。徹底測試!

+0

您應該避免在服務中呈現用戶界面,因爲您可能會觸發用戶界面檢測服務,該服務會暫時將用戶切換到服務用戶界面。 –

+0

@RaymondChen:請參閱我在其他答案中分析此UI0Detect的事情:http://stackoverflow.com/a/17400251/321013 - 我是否正確? –

0

我想提供一些信息。 Raymonds Chen's comment to the other answer

應避免在服務呈現UI,因爲你可能會觸發 的UI檢測服務,將用戶切換到您的服務UI 暫時的。 - 雷蒙德陳

我發現這些優秀的文章:

在那裏可以找到解釋什麼用戶界面檢測服務UI0Detect)是什麼以及如何提供工作。

交互式服務檢測(任務欄上的閃爍按鈕)是 遺留應用的緩解措施,檢測是否有服務 試圖與桌面交互。這由 交互式服務檢測(UI0Detect)服務處理。

然而,我們必須注意,這隻能工作,如果正試圖查看GUI的服務具有標誌「允許服務與桌面交互」設置,因爲只有這樣服務進程將運行在的Session0甚至允許它顯示任何東西。

Alex Ionescu mentions這樣的:

如果UI0Detect.exe ... 單片機在窗口掛鉤DLL的要求已經開始了。 服務將繼續... 該服務首先進行一些 驗證,以確保其運行在正確的WinSta0\Default windowstation和桌面上,然後通知SCM成功或 失敗。

所以,回過頭來雷蒙德的評論:據我所看到的,只要服務不打勾的選項type= interactsee sc.exe),通常你不選擇這個,則UI0Detect服務什麼都不做,不應該有任何觸發它的「危險」。


注意:以上信息是基於我僅在一臺Windows 7個人電腦上進行的有限研究和測試。

+0

用戶界面檢測服務如何工作的細節是所有實施細節,可隨時更改。創建用戶界面,並希望它不會觸發用戶界面檢測服務,這不是一個健全的工程實踐,因爲你今天可能會避開檢測,但是明天事情可能會改變。正確的解決方案不是顯示UI。 –

+0

@RaymondChen - 我在此感謝您的關注 - 而且您的原則肯定是對的。然而,*音響工程實踐*還告訴我,我不應該花費時間和精力去做一些極不可能改變的事情 - 並且考慮到服務應該不會顯示GUI,並且整個UI0Detect看起來似乎就像傳統的離合器一樣,如果在今天不改變的情況下顯示信息,我會非常驚訝。 (爲了完整起見,在我的具體情況下,如果不是很漂亮的話,也是可以的)。非常感謝您的洞察力! –

相關問題