2009-09-18 79 views
5

我們必須從Windows服務運行一個進程並從中獲取屏幕截圖。Windows服務下的進程屏幕截圖

我們嘗試了BitBlt和PrintWindow Win32調用,但都給出空白(黑色)位圖。

如果我們從普通的用戶進程運行我們的代碼,它就可以正常工作。

這是東西,甚至有可能?或者可以有另一種方法來嘗試?

的事情,我們嘗試:

  1. Windows服務作爲本地系統運行,運行過程作爲本地系統 - >截圖失敗
  2. Windows服務以管理員身份運行,運行過程管理 - >截圖失敗。
  3. 運行爲用戶XYZ的Windows應用程序,運行過程XYZ - >截圖作品既BitBlt函數或PrintWindow。
  4. 嘗試選中「允許服務與桌面交互」,從本地系統

我們還注意到,PrintWindow適用於我們的情況比較好,它的工作原理如果窗口後面另一個窗口。

對於其他要求,父進程和子進程必須在同一個用戶下。我們不能真正使用從一個進程到另一個進程的模擬。

+1

您是否嘗試允許該服務與桌面進行交互? – 2009-09-18 17:14:19

+0

非常好的主意,但它也不起作用。我也認爲,當我以管理員用戶身份運行它時,這相當於這樣做。你不能讓用戶從管理控制檯檢查「允許服務與桌面交互」 - 它已被禁用。 – jonathanpeppers 2009-09-18 17:18:30

+0

那些搜索,請參閱[在服務器桌面會話上捕獲屏幕](http://stackoverflow.com/questions/5200341/capture-screen-on-server-desktop-session/12851218) – Theraot 2013-12-17 21:39:42

回答

3

我不認爲這是可能的。

我們不得不改變我們的應用程序不是從服務啓動的場景,而是一個標準的Windows程序,它在角落裏有一個NotifyIcon。

如果有人仍然找到真正的答案,請告訴我。

3

您是否嘗試以「允許服務與桌面交互」的方式運行本地系統?

+0

+1 - 這是一個好主意,如果它的工作。這當然是我能想到的唯一解決方案。 – David 2009-09-18 17:18:41

+0

請參閱上面的評論。 – jonathanpeppers 2009-09-18 17:19:03

-1

它的工作原理與使用本地系統的「允許服務與桌面交互」

您可以將其編程方式使用此示例代碼設置:

http://www.vbforums.com/showthread.php?t=367177(這是vb.net,但很簡單)

+0

這隻適用於XP。不在Vista或7上。在XP上它有兩個缺點:1.如果啓用此功能,則可以通過在服務中創建網絡連接來解決問題。 2.它只會顯示在登錄的第一個用戶的桌面上。如果您快速切換到第二個用戶,您將不會看到任何內容。 – Oliver 2010-05-19 08:34:29

+0

Ad.1網絡連接?通過製作截圖? Ad.2是的,由於會話0隔離,它不適用於Vista/7 – ufoq 2010-05-19 08:46:40

6

目前我找不到相應的鏈接,但問題是,Windows服務在另一個會話中運行而不是正常的用戶應用程序。

在XP,這不是完全正確的。這裏有所有的服務開始在會話0和誰登錄到系統中的第一個用戶也將在會話0中運行。因此,在這種情況下,像技巧允許服務與桌面工作互動。但是,如果您快速切換到另一個用戶,他將獲得會話1,並且沒有機會直接與服務交互。如果您通過RDP連接到服務器版本(如2003或2008),則也是如此。這些登錄也將在高於0的會話中開始。

最後但並非最不重要存在使用與桌面交互的另一個缺點:
如果你啓用這個選項,你的服務(默認)SYSTEM帳戶下運行,則不能創建網絡連接了。

獲得與服務一起工作的自定義GUI的正確方法是將它們分成兩個進程並執行某種IPC(進程間通信)。因此,該服務將在機器啓動時啓動,並在用戶會話中啓動GUI應用程序。在這種情況下,GUI可以創建屏幕截圖,將其發送到服務,服務可以使用它,無論你喜歡什麼。