2009-09-18 18 views
5

Musimy uruchomić proces z usługi Windows i pobrać z niego zrzut ekranu.Zrzut ekranu procesu w ramach usługi Windows

Wypróbowaliśmy wywołania BitBlt i PrintWindow Win32, ale oba dają puste (czarne) bitmapy.

Jeśli uruchomimy nasz kod z normalnego procesu użytkownika, działa dobrze.

Czy jest to możliwe? Czy może być inna metoda do wypróbowania?

miejsca staraliśmy:

  1. usługa Windows działa jako system lokalny, uruchamia proces jako Local System -> screenshot nie
  2. usługi Windows z systemem jako administrator, proces przebiega jako administrator -> screenshot nie powiedzie się.
  3. Aplikacja Windows działająca jako użytkownik XYZ, uruchamia proces jak XYZ -> screenshot działa zarówno z BitBlt jak i PrintWindow.
  4. Próbował sprawdzanie „Zezwalaj usłudze na współdziałanie z pulpitem” od systemu lokalnego

Zauważyłem również, że PrintWindow działa lepiej dla naszego przypadku, to działa, jeśli okno jest za innego okna.

W przypadku innych wymagań proces nadrzędny i podrzędny muszą należeć do tego samego użytkownika. Nie możemy naprawdę używać podszywania się z jednego procesu do drugiego.

+1

Czy próbowałeś zezwolić na interakcję usługi z pulpitem? –

+0

Bardzo dobry pomysł, ale też nie działał. Myślę też, że kiedy uruchomiłem go jako Administrator, było to równoważne z robieniem tego. Nie możesz użytkownika i sprawdzić "Pozwól usłudze na interakcję z komputerem" z konsoli zarządzania - jest wyłączona. – jonathanpeppers

+0

Szukanie, zobacz także [Ekran przechwytywania na sesji pulpitu serwera] (http://stackoverflow.com/questions/5200341/capture-screen-on-server-desktop-session/12851218) – Theraot

Odpowiedz

3

Nie sądzę, że to możliwe.

Musieliśmy zmienić nasz scenariusz, w którym nasza aplikacja nie została uruchomiona z usługi, ale był standardowym programem Windows, który ma NotifyIcon w rogu.

Jeśli ktoś nadal znajdzie odpowiedź, daj mi znać.

3

Czy próbowałeś uruchomić system lokalny z zaznaczoną opcją "Zezwalaj usłudze na interakcję z komputerem"?

+0

+1 - To jest dobry pomysł, jeśli to działa. To na pewno jedyne rozwiązanie, jakie mogę wymyślić. – David

+0

Zobacz powyższy komentarz. – jonathanpeppers

-1

Działa using System lokalny z "Zezwalaj usłudze na współdziałanie z pulpitem"

Można ustawić go programowo za pomocą tego przykładowego kodu:

http://www.vbforums.com/showthread.php?t=367177 (jest to bardzo proste, ale vb.net)

+0

Działa to tylko w XP. Nie na Vista lub 7. A na XP ma dwie wady: 1. Jeśli to włączysz, możesz napotkać problemy, tworząc połączenia sieciowe w swojej usłudze. 2. Pojawi się tylko na pulpicie pierwszego zalogowanego użytkownika. Jeśli szybko zmienisz drugiego użytkownika, nic nie zobaczysz. – Oliver

+0

Ad.1 Połączenia sieciowe? Robiąc zrzut ekranu? Ad.2 Tak, masz rację, ze względu na izolację sesji 0 nie działa w Vista/7 – ufoq

6

Obecnie nie mogę znaleźć odpowiednich łączy, ale problem polega na tym, że usługa Windows działa w innej sesji niż zwykła aplikacja użytkownika.

W XP nie było to w pełni prawdą. Oto wszystkie usługi uruchomione w sesji 0, a pierwszy użytkownik, który zaloguje się do systemu, uruchomi także sesję 0. W takim przypadku sztuczki takie jak zezwalają na interakcję usługi z pulpitem. Ale jeśli szybko przełączasz się na innego użytkownika, otrzymuje on Sesję 1 i nie ma możliwości bezpośredniego kontaktu z usługą. Jest to również prawdą, jeśli łączysz się przez RDP z wersją serwera (taką jak 2003 lub 2008). Te logowania będą również uruchamiane w sesji wyższej niż 0.

Ostatni, ale nie najmniej jest inna wada za pomocą interakcji z pulpitem:
Jeśli włączysz tę opcję, a usługa jest uruchomiona pod (domyślnie) konta SYSTEM nie będzie w stanie utworzyć połączenia sieciowego już.

Poprawnym sposobem uzyskania niestandardowego GUI, który działa z usługą, jest rozdzielenie ich na dwa procesy i wykonanie pewnego rodzaju IPC (komunikacja między procesami). Usługa uruchomi się po pojawieniu się komputera i uruchomieniu aplikacji GUI w sesji użytkownika. W takim przypadku GUI może utworzyć zrzut ekranu, wysłać go do usługi i usługa może z nim zrobić, cokolwiek chcesz.