Сделайте снимок экрана, используя Directx11 под С#

Я использовал Directx11 в С#, чтобы сделать снимок экрана, но в итоге я получил только 0 в диапазоне, не знаю почему, в середине нет ошибки, и выполнение возвращает 0, код использует Silk.net.direct3d11 библиотека

Я также попробовал это, создав промежуточную текстуру Text2D, затем скопировав мою DesktopTexture в эту промежуточную текстуру Text2D, а затем скопировав из промежуточной текстуры Text2D в stagingResource.

//....
        ID3D11Device* device=null;
        ID3D11DeviceContext* context=null;
        D3DFeatureLevel featureLevel=D3DFeatureLevel.Level101;
        D3DFeatureLevel[] featureLevels =
        [
            D3DFeatureLevel.Level111, D3DFeatureLevel.Level110, D3DFeatureLevel.Level101,D3DFeatureLevel.Level100
        ];
        fixed (D3DFeatureLevel* pFeatureLevels = &featureLevels[0])
        {
            D3D11 d3D11 = new D3D11(new DefaultNativeContext("d3d11"));
            if (d3D11.CreateDevice((IDXGIAdapter*)adapter1, D3DDriverType.Unknown, IntPtr.Zero,
                    (uint)CreateDeviceFlag.None,pFeatureLevels,(uint)featureLevels.Length, D3D11.SdkVersion, ref device,
&featureLevel, ref context)!=0){/*..*/}
        }
        ID3D11DeviceContext* immediateContext = null;
        device->GetImmediateContext(ref immediateContext);
        IDXGIOutputDuplication *outputDuplication = null;
        if (output5.DuplicateOutput((IUnknown*)device, ref outputDuplication)!=0){/*..*/}
        OutduplFrameInfo outduplFrameInfo = new OutduplFrameInfo();
        IDXGIResource* desktopResource = null;
        if (outputDuplication->AcquireNextFrame(1000, &outduplFrameInfo, &desktopResource)!=0{/*..*/}
        if (desktopResource->QueryInterface<ID3D11Resource>(out var desktopTexture)!=0){/*..*/}
        Texture2DDesc stagingTextureDesc = new()
        {
            CPUAccessFlags = (uint)CpuAccessFlag.Read,
            BindFlags = (uint)(BindFlag.None),
            Format = Format.FormatB8G8R8A8Unorm,
            Width = (uint)desc.DesktopCoordinates.Size.X,
            Height = (uint)desc.DesktopCoordinates.Size.Y,
            MiscFlags = (uint)ResourceMiscFlag.None,
            MipLevels = 1,
            ArraySize = 1,
            SampleDesc = { Count = 1, Quality = 0 },
            Usage = Usage.Staging
        };
        ID3D11Texture2D* stagingTexture = null;
        if (device->CreateTexture2D(&stagingTextureDesc,null,ref stagingTexture )!=0){/*..*/}
        stagingTexture->QueryInterface<ID3D11Resource>(out var stagingResource);
immediateContext->CopyResource(stagingResource, desktopTexture);
        MappedSubresource mappedSubresource=new MappedSubresource();
        if (immediateContext->Map(stagingResource, 0, Map.Read, 0, &mappedSubresource)!=0){/*..*/}
        var span = new ReadOnlySpan<byte>(mappedSubresource.PData,
            (int)mappedSubresource.DepthPitch);

Что я делаю не так?

У вас есть полный код воспроизведения? Мы не можем использовать ту часть, которую ты засунул.

Simon Mourier 31.05.2024 08:36

@SimonMourier gist.github.com/MakesYT/6de981d0432a1ab9ded9eae64989f969

MakesYT 31.05.2024 11:28

Это не воспроизводящий код, а просто фрагменты некомпилируемого кода.

Simon Mourier 04.06.2024 20:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

AcquireNextFrame не обещает сразу предоставить вам скриншот. Возможно, вам придется вызвать его несколько раз, прежде чем текстура будет готова.

Подробнее см. в этом ответе: AcquireNextFrame не работает (API дублирования рабочего стола и D3D11).

Странное явление заключается в том, что если я поставлю точку останова в AcquireNextFrame, а затем вручную возобновлю выполнение, все будет работать нормально, но если точки останова нет, попытки будут выполняться бесконечно. cs while (true) { OutduplFrameInfo outduplFrameInfo = new OutduplFrameInfo(); desktopResource = null; if (outputDuplication->AcquireNextFrame(5000, &outduplFrameInfo, &desktopResource)==0&&outduplFrameInfo.LastPresentTime!=0) { break; } Console.WriteLine("recall"); }

MakesYT 31.05.2024 13:54

Или Thread.Sleep(2); Тоже подойдет

MakesYT 31.05.2024 13:57

Итак, вы нашли ответ, на который я дал ссылку, а также комментарий там, не так ли?

Roman Ryltsov 31.05.2024 13:58

Да, но есть еще некоторые проблемы

MakesYT 31.05.2024 14:00

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

Похожие вопросы

Почему позже в скрипте массив объектов становится нулевым, даже после подтверждения того, что после инициализации он не равен нулю?
C# XUnit (.Net 8): параметр IFormFile в конечной точке, подлежащей тестированию, всегда принимается как нулевой
Как я могу запускать метод через определенные промежутки времени? System.Timers.Timer, кажется, теряет синхронизацию
Почему игровой объект игрока продолжает двигаться в воздухе, несмотря на то, что клавиши движения не нажимаются? (закрыто)
Выполняется ли Dispose of my Activity синхронно с кодом моего приложения?
Привязка WPF MVVM DataGrid к IEnumerable вызывает ошибки привязки к Int32
Как избежать бесконечного цикла перенаправления при объединении двух разных схем аутентификации (openIdConnect и ASP.NET Identity)?
Добавьте несколько синглтонов одного и того же класса обслуживания во внедрение зависимостей в .NET 8
Универсальный способ извлечения значений тегов из XML-документа в список List<string>
Обновление .NET 8 ISOLATED прекратило регистрацию информации, отладки