Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Zrób zrzut ekranu pełnoekranowej aplikacji DirectX
#1
Cześć!   Postanowiłem opracować "zaawansowane narzędzie do zrzutów ekranu" (w języku C #) i mam problem z zrobieniem zrzutu ekranu z pełnoekranowej aplikacji DirectX: zawsze otrzymuję czarny zrzut ekranu. Działa to jednak świetnie, jeśli aplikacja działa w trybie "okienkowym" lub "okienkowym bez granic". Ostatnie 3 dni spędziłem na wyszukiwaniu w Google i próbowaniu wielu kodów, ale nie mogę znaleźć rozwiązania.   Jestem dobrym programistą C #, ale nie wiem w ogóle jak działa DirectX ... Domyślam się, że to jest problem.     Oto kod (używa SlimDX: http://slimdx.org):     Kod:   public static class Direct3DCapture {private static SlimDX. Direct3D9. Direct3D _direct3D9 = nowy SlimDX. Direct3D9. Direct3D (); prywatny statyczny słownik <IntPtr, SlimDX. Direct3D9. Urządzenie> _direct3DDeviceCache = new Dictionary <IntPtr, SlimDX. Direct3D9. Urządzenie> (); /// <summary> /// Przechwytuj cały obszar klienta okna /// </ summary> /// <nazwa parametru = "hWnd"> </ param> /// <zwraca> </ zwraca> publiczny static Bitmap CaptureWindow (IntPtr hWnd) {return CaptureRegionDirect3D (hWnd, NativeMethods. GetAbsoluteClientRect (hWnd)); } /// <summary> /// Przechwytuj region ekranu używając Direct3D /// </ summary> /// <nazwa parametru = "uchwyt"> Uchwyt okna </ param> /// <param name = "region"> Region do przechwytywania (na współrzędnych ekranu) </ param> /// <zwraca> Mapa bitowa zawierająca przechwycony region, należy to odpowiednio usunąć po zakończeniu </ powrot> publicznej statycznej Bitmapy CaptureRegionDirect3D (Uchwyt IntPtr, region Rectangle) {IntPtr hWnd = uchwyt; Bitmap bitmap = null; // Obsługujemy tylko główną kartę graficzną dla trybu Direct3D SlimDX. Direct3D9. AdapterInformation adapterInfo = _direct3D9. Adaptery. DefaultAdapter; SlimDX. Direct3D9. Urządzenie urządzenia; #region Uzyskaj urządzenie Direct3D // Odzyskaj istniejące urządzenie Direct3D, jeśli już utworzyliśmy je dla danego uchwytu, jeśli (_direct3DDeviceCache. ContainsKey (hWnd)) {urządzenie = _direct3DDeviceCache [hWnd]; } // Musimy stworzyć nowe urządzenie else {// Skonfiguruj parametry tworzenia urządzenia SlimDX. Direct3D9. Parametry PresentParameters = nowy SlimDX. Direct3D9. PresentParameters (); parametry. BackBufferFormat = adapterInfo. Bieżący tryb wyświetlania . Format; Rectangle clientRect = NativeMethods. GetAbsoluteClientRect (hWnd); parametry. BackBufferHeight = clientRect. Wysokość ; parametry. BackBufferWidth = clientRect. Szerokość; parametry. Multisample = SlimDX. Direct3D9. MultisampleType. Żaden ; parametry. SwapEffect = SlimDX. Direct3D9. SwapEffect. Odrzucać ; parametry. DeviceWindowHandle = hWnd; parametry. PresentationInterval = SlimDX. Direct3D9. PresentInterval. Domyślna ; parametry. FullScreenRefreshRateInHertz = 0; // Utwórz urządzenie urządzenia Direct3D = nowy SlimDX. Direct3D9. Urządzenie (_direct3D9, adapter adaptera adaptera, SlimDX, Direct3D9, DeviceType, sprzęt, hWnd, SlimDX, Direct3D9, CreateFlags, SoftwareVertexProcessing, parametry); _direct3DDeviceCache. Dodaj (hWnd, urządzenie); } #endregion // Przechwytywanie ekranu i kopiowanie regionu na mapę bitową za pomocą (SlimDX, Direct3D9, Surface surface = SlimDX, Direct3D9, Surface, CreateOffscreenPlain (urządzenie, adapterInfo, CurrentDisplayMode, Width, adapterInfo, CurrentDisplayMode, Height, SlimDX, Direct3D9. Format: A8R8G8B8, SlimDX, Direct3D9, Pula. SystemMemory)) {urządzenie. GetFrontBufferData (0, powierzchnia); // Aktualizacja: dziękuję digitalutopia1 za wskazanie, że SlimDX naprawił błąd // gdzie poprzednio oczekiwali struktury typu RECT dla swojej mapy bitowej Rectangle = new Bitmap (SlimDX. Direct3D9. Surface. ToStream (surface, SlimDX. Direct3D9. ImageFileFormat .Bmp , nowy Rectangle (region Lewo, region, góra, region, szerokość, region, wysokość))); // Poprzednie obejście problemu SlimDX: nowy Rectangle (region.Left, region.Top, region.Right, region.Bottom))); } Return bitmap; }} #Region Natywny Win32 Interop ///
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)