[英].NET Windows 7 take screenshot not working when running under 'Windows Service' with 'Local System Account'
在Windows 7 x64上運行,我具有以下代碼,當我將其作為獨立應用程序(例如ConsoleApplication1)運行時,它可以正常工作:
var screen = Screen.PrimaryScreen;
using (var bitmap = new Bitmap(screen.Bounds.Width, screen.Bounds.Height))
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.CopyFromScreen(new Point(screen.Bounds.Left, screen.Bounds.Top), new Point(0, 0),
screen.Bounds.Size);
bitmap.Save(@"c:\\Test.png", ImageFormat.Png);
}
我需要將此代碼放入帶有“本地系統帳戶”和“允許服務與桌面交互”的“ Windows服務”中,但是當我在此處運行它時,它捕獲了黑屏。
我了解Win7中的服務是隔離的,並且與桌面沒有任何交互,但是我需要以某種方式截屏或傳遞一些管理員憑據。
Windows服務必須以“本地系統帳戶”身份運行,我無法將其更改為以管理員身份運行
我如何仍然可以截屏?
截屏與GUI有關,但是Windows服務沒有GUI。 此msdn文章提供了一種解決方法,但是它說:在安全性較高的上下文中運行的服務(如LocalSystem帳戶)不應在交互式桌面上創建窗口,因為在交互式桌面上運行的任何其他應用程序都可以與此交互。窗口。 這會將服務公開給登錄用戶執行的任何應用程序。 此外,作為LocalSystem運行的服務不應通過調用OpenWindowStation或GetThreadDesktop函數來訪問交互式桌面。
同樣,這些帖子討論的問題更多:1. Windows服務屏幕捕獲返回黑屏 2. 如何在服務上運行Windows GUI應用程序?
您正在拍攝的屏幕快照為會話0桌面。 這是服務運行的地方。 “允許服務與桌面交互”選項可能僅憑其描述可能會引起誤解。 這是對其允許內容的很好描述: http : //msdn.microsoft.com/zh-cn/library/windows/desktop/ms683502(v=vs.85).aspx
一次可以有多個“桌面”可用,因為您可以登錄多個用戶(快速用戶切換和RDP)。 您可能需要優化方法,以獲取“控制台”用戶的會話或當前登錄的用戶的會話。
您將需要在窗口會話中運行的代理進程來執行此操作。
我建議您進一步研究兩件事,並為您找到正確的選擇:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.