C # Сделать снимок экрана окна / рабочего стола с помощью SlimDX

Я новичок в SlimDX и слышал, что есть способ делать снимки экрана с помощью этой библиотеки. Причина, по которой я хочу использовать SlimDX, заключается в том, что я хочу делать скриншоты намного быстрее, чем

Graphics.CopyFromScreen()

так что я могу сделать приложение для прямой трансляции, работающее с более высокой частотой кадров.

У меня есть код, который я нашел в Интернете, который должен захватывать рабочий стол, но он всегда дает сбой в строке, где я создаю экземпляр устройства.

Я попытался изменить параметр DeviceType на Software, а CreateFlags на Multithreaded, чтобы посмотреть, не изменится ли что-нибудь, но ничего не изменилось, и вот что он говорит каждый раз:

SlimDX.Direct3D9.Direct3D9Exception: 'D3DERR_INVALIDCALL: недопустимый вызов (-2005530516)'

Вот код, который у меня есть:

var pp = new PresentParameters();
pp.Windowed = true;
pp.SwapEffect = SwapEffect.Discard;

var d = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.SoftwareVertexProcessing, pp);
var surface = Surface.CreateOffscreenPlain(d, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, Format.A8R8G8B8, Pool.Scratch);

d.GetFrontBufferData(0, surface);

//not sure if this will work
var ds = Surface.ToStream(surface, ImageFileFormat.Jpg);
var img = Image.FromStream(ds);

Я также читал, что это может быть результатом того, что BackBuffer не поддерживается видеокартой, но в этом случае я действительно не знаю, как это исправить.

Моя видеокарта AMD R270X.

Есть идеи?


person Tom Lenc    schedule 31.12.2017    source источник


Ответы (1)


Установка pp.BackBufferCount на 0 сработала. Хотя время захвата по-прежнему довольно велико ...

person Tom Lenc    schedule 01.01.2018
comment
Можете ли вы показать код, как вам удалось сделать снимок экрана игры? - person Aks4125; 27.07.2020