2012-05-04 21 views
7

Sytuacja: Mam oprogramowanie, które wykonuje udostępnianie ekranu przez Internet, gdzie jeden użytkownik działa jako prezenter, a inni użytkownicy działają jako widzowie/uczestnicy.C++ - Przechwytywanie ekranu, z wyjątkiem niektórych okien

Poza oknami prezentacji, prezenter ma również zestaw OKNO BEZPŁATNE, które pojawiają się na ekranie (pasek przycisków do rozpoczęcia udostępniania/zaprzestania udostępniania/itp., Okna Skype itp.).

Prezentujący może skonfigurować konfigurację oprogramowania do udostępniania ekranu, aby uczynić te okna niewidoczne (niewidoczne) (tj. Nie pojawią się w udostępnianiu ekranu, które są wysyłane do uczestników, ale zawartość okna za nimi będzie pojawią się na zrzucie ekranu).

Zrzuty ekranu są wysyłane z szybkością około 10 klatek na sekundę lub szybciej.

Pytanie: w jaki sposób mogę programowo przechwycić ekran, z wyjątkiem tych okien, które nie są udostępniane?

Uwagi:

  • Ze względu na wyższą wartość klatek na sekundę, nie mogę zminimalizować/zmaksymalizować/set alfa dla tych okien, bo wtedy okna będzie migotać. Aplikacja napisana jest w Win32 C++.
  • Używałbym warstwowych okien, ale z powodu funkcji kompozycji pulpitu Windows 7, nie można jej użyć bez użycia komputera (w systemie Windows 8 nie można już używać funkcji DwmEnableComposition, aby czasowo i programowo wyłączyć kompozycję)
  • Mogę użyć metody warstwowego okna dla systemu Windows XP/2000/7 itd. I innego podejścia dla systemu Windows 8 (jeśli taki istnieje), choć wolałbym pojedynczy proces, który działa na wszystkich systemach
  • Mogę również spróbuj "skomponować" zrzuty ekranu, przechwytując pojedyncze obrazy (na pulpicie, okna, które trzeba przechwycić) i używając ich indeksu Z, aby utworzyć ostateczny obraz, ale z powodu wymaganej liczby klatek na sekundę, ten proces byłoby zbyt wolne.
+0

Wiem, że moje spotkanie z MSFT to dobry przykład, chociaż nie wiem, jak to się robi. – zinking

+0

Dziękuję - są podobne produkty, które to robią (JoinMe lub GTM), spróbuję również to zbadać, ale miałem nadzieję na szybszą odpowiedź. –

+0

Funkcja przechwytywania ekranu zwykle przechwytuje "obszar ekranu nad oknem" zamiast rysowanej zawartości samego okna. Możesz spróbować przechwycić wszystkie widoczne okna najwyższego poziomu i przekomponować je. – Deanna

Odpowiedz

-1

Myślę, że ograniczenie zawartości przechwytywania w dużym oknie będzie prostsze. w przeciwnym razie będziesz musiał wyciąć niektóre okna z przechwytywania ekranu.

+0

Dziękuję, ale ponieważ jest to aplikacja do udostępniania ekranu (ponownie, s/w, takie jak JoinMe i GoToMeeting już to robią), nie jest to przyjazne dla użytkownika (lub biznesowe), aby zmusić użytkownika do wybrania tylko jednego okna :) –

+3

W każdym razie moje pytanie było bardziej techniczne - czy ktoś wie, które ** instrukcje C/C++ ** mogę użyć do przechwytywania ekranów w Windows 7 i/lub 8 i ** nie ** renderować niektóre z widocznych okien? Szukam ** odpowiednika warstwowych okien ** (zobacz następujący [link MSDN] (http://social.msdn.microsoft.com/Forums/zh/vcgeneral/thread/6f1e9f74-ae6e-4df1-92b8- 72e7a98bf58f) na przykład korzystania z warstwowych okien) –

1

W oknach nawet pulpit jest uważany za okno i ma własny HWND. Wydaje się jednak, że nie można łatwo skopiować tylko "tapety" na własną rękę.

Zasadniczo widzę dwa sposoby, aby to zrobić. 1. Skopiuj cały pulpit, np. BitBlt (GetWindowDC (GetDesktopWindow()), ...)

lub

  1. Zastosowanie GetWindow i przechodzenie listy okna w kierunku do tyłu, wychodząc z pulpitu Window którego HWND po prostu może ustalić z GetDesktopWindow() w następujący sposób:

    // paint on a black DC hwnd=GetDesktopWindow() while (hwnd = GetWindow(hwnd, GW_HWNDPREV)) { // is this window not shared? continue // else bitblt it into our dc }

nadzieję, że dała inspirację :-) Jeśli ktoś zna wa y jak skopiować TYLKO pulpit bez okien potomnych proszę dać mi znać.

+0

Próbowałem już 4 miesiące temu. Ta metoda spowoduje problem z przechwytywaniem niektórych elementów pulpitu, takich jak menu Start i pasek narzędzi. Będą one drukowane jako czarne na DC i nie będzie tworzona przezroczystość. – Vishnu

Powiązane problemy