Как захватить неактивное окно, используя slimdx

Прежде всего, я использую приведенный ниже код,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SlimDX.Direct3D9;
using SlimDX;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Runtime.InteropServices;
using System.IO;
using System.Collections.ObjectModel;
using KMPP;
using System.Diagnostics;
using System.Threading;

namespace KMPP
{
    public class DxScreenCapture
    {
        Device d;

        public DxScreenCapture()
        {
            PresentParameters present_params = new PresentParameters();
            present_params.Windowed = true;
            present_params.SwapEffect = SwapEffect.Discard;

            d = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.SoftwareVertexProcessing, present_params);
        }

        public Surface CaptureScreen()
        {
            Surface s = Surface.CreateOffscreenPlain(d, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, Format.A8R8G8B8, Pool.Scratch);
            d.GetFrontBufferData(0, s);
            return s;
        }
    }
    namespace WindowsFormsApplication4
    {
        static class Program
        {
            [STAThread]
            static void Main()
            {
                Stopwatch stopwatch = new Stopwatch();
                DateTime current = DateTime.Now;
                string n = string.Format(@"text-{0:yyyy-MM-dd_hh-mm-ss-tt}.bmp", DateTime.Now);

                string directory = (@"C:\temp\");
                string name = (".bmp");
                string filename = String.Format("{0:hh-mm-ss}{1}", DateTime.Now, name);
                string path = Path.Combine(directory, filename);

                stopwatch.Start();

                Thread.Sleep(1000);
                DxScreenCapture sc = new DxScreenCapture();

                Surface s = sc.CaptureScreen();
                Surface.ToFile(s, path, ImageFileFormat.Bmp);
                stopwatch.Stop();
                s.Dispose();

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form());
            }
        }
    }
}

Я получаю весь скриншот рабочего стола (код выше). затем, как я могу получить bmp конкретного неактивного окна? (это значит передать hwnd окна для захвата mathod и сохранить файл bmp в c:\inactive_window.bmp) это возможно?

пс. конкретная целевая программа связана с DirectX, поэтому я не могу получить скриншот, используя printwindow, bitblt и т. д. (этот метод просто возвращает черный экран bmpfile)

0 ответов

Другие вопросы по тегам