Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private static SlimDX.Direct3D9.Direct3D _direct3D9 = new SlimDX.Direct3D9.Direct3D();
- private static Dictionary<IntPtr, SlimDX.Direct3D9.Device> _direct3DDeviceCache = new Dictionary<IntPtr, SlimDX.Direct3D9.Device>();
- private SlimDX.Direct3D9.AdapterCollection _adaptersInfo = _direct3D9.Adapters;
- --------------------
- // Executed from Timer
- private void DeskCapture()
- {
- _GlobalVariables.var_hWnd = User32.GetWindowsHandle();
- Bitmap b;
- b = CaptureDXScreen(_GlobalVariables.var_hWnd);
- if (true)
- b.Save(@"_last_scr.jpg", ImageFormat.Jpeg);
- b.Dispose();
- }
- public static Bitmap CaptureDXScreen(IntPtr hWnd)
- {
- Bitmap bitmap = null;
- SlimDX.Direct3D9.AdapterInformation adapterInfo = _direct3D9.Adapters[_GlobalVariables.SelectedDisplay];
- SlimDX.Direct3D9.Device device;
- int DisplayWidth = adapterInfo.CurrentDisplayMode.Width;
- int DisplayHeight = adapterInfo.CurrentDisplayMode.Height;
- #region Get Direct3D Device
- // Retrieve the existing Direct3D device if we already created one for the given handle
- if (_direct3DDeviceCache.ContainsKey(hWnd))
- {
- device = _direct3DDeviceCache[hWnd];
- }
- // We need to create a new device
- else
- {
- SlimDX.Direct3D9.PresentParameters presentParams = new SlimDX.Direct3D9.PresentParameters();
- presentParams.Windowed = true;
- presentParams.BackBufferCount = 1;
- presentParams.BackBufferFormat = adapterInfo.CurrentDisplayMode.Format;
- presentParams.BackBufferWidth = DisplayWidth;
- presentParams.BackBufferHeight = DisplayHeight;
- presentParams.SwapEffect = SlimDX.Direct3D9.SwapEffect.Flip;
- presentParams.DeviceWindowHandle = hWnd;
- presentParams.PresentationInterval = SlimDX.Direct3D9.PresentInterval.One;
- presentParams.FullScreenRefreshRateInHertz = 0;
- presentParams.PresentFlags = SlimDX.Direct3D9.PresentFlags.LockableBackBuffer; //Massive speed-up?
- //presentParams.PresentFlags = SlimDX.Direct3D9.PresentFlags.None;
- presentParams.EnableAutoDepthStencil = true;
- while (true)
- {
- presentParams.AutoDepthStencilFormat = SlimDX.Direct3D9.Format.D32;
- if (_direct3D9.CheckDeviceFormat(0, SlimDX.Direct3D9.DeviceType.Hardware, presentParams.BackBufferFormat, SlimDX.Direct3D9.Usage.DepthStencil, SlimDX.Direct3D9.ResourceType.Surface, presentParams.AutoDepthStencilFormat)) break;
- presentParams.AutoDepthStencilFormat = SlimDX.Direct3D9.Format.D24X8;
- if (_direct3D9.CheckDeviceFormat(0, SlimDX.Direct3D9.DeviceType.Hardware, presentParams.BackBufferFormat, SlimDX.Direct3D9.Usage.DepthStencil, SlimDX.Direct3D9.ResourceType.Surface, presentParams.AutoDepthStencilFormat)) break;
- presentParams.AutoDepthStencilFormat = SlimDX.Direct3D9.Format.D16;
- if (_direct3D9.CheckDeviceFormat(0, SlimDX.Direct3D9.DeviceType.Hardware, presentParams.BackBufferFormat, SlimDX.Direct3D9.Usage.DepthStencil, SlimDX.Direct3D9.ResourceType.Surface, presentParams.AutoDepthStencilFormat)) break;
- // Your graphics card does not support 16bit, 24bit nor 32bit depth stencil buffers!
- }
- device = new SlimDX.Direct3D9.Device(_direct3D9, adapterInfo.Adapter, SlimDX.Direct3D9.DeviceType.Hardware, hWnd, SlimDX.Direct3D9.CreateFlags.HardwareVertexProcessing, presentParams);
- _direct3DDeviceCache.Add(hWnd, device);
- }
- #endregion
- // Capture screen and copy the region into a Bitmap
- /* /* Method 1: GetFrontBufferData [!WORKS!] [!SLOWLY!]
- //------------------------------------------------------------
- //--NOTE--: While DWM is disabled and device.Adapter is >0 (not primary) than picture on grabbed surface is shifted in some direction by the width of primary screen
- //--------: *When DWM is enabled it works ok
- //------------------------------------------------------------
- using (SlimDX.Direct3D9.Surface surface = SlimDX.Direct3D9.Surface.CreateOffscreenPlain(device, adapterInfo.CurrentDisplayMode.Width, adapterInfo.CurrentDisplayMode.Height, SlimDX.Direct3D9.Format.A8R8G8B8, SlimDX.Direct3D9.Pool.SystemMemory))
- {
- device.GetFrontBufferData(0, surface);
- bitmap = new Bitmap(SlimDX.Direct3D9.Surface.ToStream(surface, SlimDX.Direct3D9.ImageFileFormat.Bmp, new Rectangle(0, 0, DisplayWidth, DisplayHeight)));
- }
- // */
- //* /* Method 2: GetBackBuffer [!DOES NOT WORK!] [!FASTER?!]
- //------------------------------------------------------------
- //--NOTE--: Output picture is black. DWM no matters I guess...
- //------------------------------------------------------------
- int _width = DisplayWidth/_GlobalVariables.var_ScreenDivide;
- int _height = DisplayHeight / _GlobalVariables.var_ScreenDivide;
- Surface _renderTarget = null;
- using (Surface backBuffer = device.GetBackBuffer(0, 0))
- {
- Surface.ToFile(backBuffer, "__m2_backbuffer.jpg", ImageFileFormat.Jpg);
- /// First Get Render Target, so we know the exactly size of the surface
- Surface renderTargetTemp = device.GetRenderTarget(0);
- // Create our Surface
- _renderTarget = Surface.CreateRenderTarget(device, _width, _height, renderTargetTemp.Description.Format, MultisampleType.None, 0, false);
- // Resize from Render Surface to Our Surface || src,dest
- device.StretchRectangle(renderTargetTemp, _renderTarget, TextureFilter.None);
- // Get Render Data
- renderTargetTemp = _renderTarget;
- // Create offscreen surface to use as copy of render target data
- _renderTarget = Surface.CreateOffscreenPlain(device, _width, _height, renderTargetTemp.Description.Format, Pool.SystemMemory);
- // copies renderTarget data from device memory to system memory || src,dest
- device.GetRenderTargetData(renderTargetTemp, _renderTarget);
- // And release our surface
- renderTargetTemp.Dispose();
- //enkel als debug:
- Surface.ToFile(_renderTarget, "_m2_surface.jpg", ImageFileFormat.Jpg);
- bitmap = new Bitmap(SlimDX.Direct3D9.Surface.ToStream(_renderTarget, SlimDX.Direct3D9.ImageFileFormat.Bmp, new Rectangle(0, 0, _width, _height)));
- }
- // */
- /* /* Method 3: GetBackBuffer [!DOES NOT WORK!] [!FASTER?!]
- //------------------------------------------------------------
- //--NOTE--: Output picture is black. DWM no matters I guess...
- //------------------------------------------------------------
- using (SlimDX.Direct3D9.Surface surface = device.GetRenderTarget(0))
- {
- Surface.ToFile(surface, "_m3_ss1.jpg", ImageFileFormat.Jpg);
- using (SlimDX.Direct3D9.Surface surface2 = SlimDX.Direct3D9.Surface.CreateOffscreenPlain(device, surface.Description.Width, surface.Description.Height, surface.Description.Format, SlimDX.Direct3D9.Pool.SystemMemory))
- {
- Surface.ToFile(surface2, "_m3_ss2.jpg", ImageFileFormat.Jpg);
- device.GetRenderTargetData(surface, surface2);
- // You have to use client coordinates here
- bitmap = new Bitmap(SlimDX.Direct3D9.Surface.ToStream(surface2, SlimDX.Direct3D9.ImageFileFormat.Bmp, new Rectangle(0, 0, _width, _height)));
- }
- }
- // */
- return bitmap;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement