• 0
Pax Beach

Снимок экрана в полноэкранном приложении DirectX

Вопросы

Мне нужно сделать снимок экрана из своего приложения в приложении DirectX (в игре).

По-быстрому накидал приложение, исходники здесь: MakeScreenshot-Forum.zip

screen.jpg.ee04f8b3fb65b38a05dcabf7a6ad22ef.jpg

1. по нажатию единственной кнопки будет выполнена серия из 16 снимков экрана. Если запущен Скайп, то фотографироваться будет содержимое его окна.

2. По нажатии CTRL+ALT+F9 будет сделан единичный снимок

3. Label внизу показывает сколько миллисекунд затрачено на вывод снимка

4. В комментах так же вы найдете, как работать со снимками через буфер обмена.

 

Работа выполняется через GetDC(NULL);

Windows 10 x64. Снимки делаются. И DirectX тоже нормально фотографируется.

НО! только в оконных приложениях.

Если приложение DirectX полноэкранное, то на всех снимках одна и та же картинка с первого снимка.
То есть изменение буфера экрана в приложении ни как не отражается на снимках.

 

Что нужно? Необходимо делать снимки конкретного приложения через интерфейс DirectX, а точнее, я так понимаю, через DirectShow. Тогда не будет разницы в окне оно или на полный экран.

Помогите плиз, знающие люди, с решением этой задачи.

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

 

Ссылки теме:

1. DIRECTX FOR DELPHI

2. unofficial version of DelphiX

3. DirectX для начинающих

4. MinHook - The Minimalistic x86/x64 API Hooking Library

5. Various methods for capturing the screen

6. Вывод графики на рабочий стол Windows с использованием оверлеев DirectX

7. Project JEDI

8. Реализация перехвата вызовов API — исчерпывающе про внедрение DLL, если разобраться, + это на Delphi

UPD:

9. Серия видео уроков Пишем D3D-хук — все понятно, только в Delphi перенести нужно.

UPD 2:

Научился рисовать в Direct3D и ловить интерфейс IDirect3DDevice9. Теперь делаю DLL ловушку для реализации снимков.

 

Изменено пользователем Pax Beach

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 ответов на этот вопрос

  • 0
7 минут назад, Rusland сказал:

Поиск — это искусство.

Спасибо тебе огромное! Не понимаю, как я мог его не найти.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Приведенный класс не корректно работает в полноэкранном режиме.

К тому же в режиме DirectX не верно определяется видеоадаптер.

Разбираюсь с этим пока.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
23 минуты назад, Rusland сказал:

Может из этого граббера можно получить какую-то полезную информацию

компилится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Компилится, но не понял как он должен грабить видео

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, Rusland сказал:

Компилится, но не понял как он должен грабить видео

Это граббер с утройств, написер с камеры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 минуты назад, Rusland сказал:

тогда ой )

В этом видимо есть какой-то потенциал, если научиться получить DX контекст в качестве устройства для метода ICreateDevEnum

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Собственно где я это нашел,  и обсуждалось что нужно переделать эти исходники, чтобы делать снимок с DirectX

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 минуты назад, Rusland сказал:

Собственно где я это нашел,  и обсуждалось что нужно переделать эти исходники, чтобы делать снимок с DirectX

давай уже ссылку, может там люди что-нить еще рассказывают )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ссылку не найду... но там старая тема и ничего интересно кроме этих исходников

Хотя вот нашел. Может тебе на Си писать dll? Есть же решения.

Еще чего-то про оверлеи, не знаю полезно ли оно.

А может можно эмулировать нажатие Printscreen и брать из буфера обмена?

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Никакие оверлеи, и уж тем более всяческие эмуляции нажатий, или посылки сообщений окну не позволят устойчиво снимать скрин direct-x приложения (полноэкранного). Директ работает не так, как GDI, а посему в определенный момент в памяти ничего не будет, там, откуда вы пытаетесь получить инфу. ЕДинственный метод - хучить вызовы и свою dll в процесс, как впрочем и делает большинство граберов, которые позволяют подобное (это если выражаться очень условно). Посему, если это не бот - решение именно такое. Вышеописанный класс работает НА direct-x но С экранной памятью - в полноэкранном режиме это бессмысленно

 

Вот, для общего развития C# – SCREEN CAPTURE WITH DIRECT3D 9 API HOOKS

Там шарп, но для понимания сути пойдет. Да и на крайний случай, можно либо переписать, либо засунуть в dll шарп-код а потом дергать оттуда нужное. 

 

P.S. к слову, если внизу цифры верные (для одного скрина), то это п... очень медленно. И на 10-ке, ну и на 8-ке со скрипом лучше использовать Desktop Duplication API. Скорость работы такая же, как и у GDI, но при этом чертовски маленькая нагрузка на систему.

Изменено пользователем Gingercat

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Вадим Смоленский
      В феврале я сетовал, что мое Windows-приложение не хочет нормально запускаться в Linux под Wine 3.0. Но время идет, вышел Wine 3.6 - и теперь один из тестировщиков радостно сообщил, что всё заработало, за вычетом одного досадного момента. А именно: приложение способно сохранять фокус ввода лишь долю секунды, потом теряет. Соответственно, невозможно ничего ввести в текстовые боксы, разве только одну-две буквы. Можно щелкнуть по заголовку приложения, оно опять получит фокус - и через мгновение снова потеряет. Куда именно при этом переходит фокус, непонятно. Тестировщик утверждает, что только мое приложение ведет себя так, все остальные работают нормально.
      Нет ли у кого-нибудь идей? Что нужно проверить?
    • От SIARHEI RAHOUSKI
      Создал проект там куча компонентов. Но разворачивании формы на весь экран компоненты размер не меняют:
      Прочитал про свойства align Но как только я выставлю Group box например left другим right все сбивается в кучу и поправить это не могу. 
      Как настроить align ?

    • От SIARHEI RAHOUSKI
      Как сделать форму с компонентами под все разрешения?

    • От SIARHEI RAHOUSKI
      Как сделать мозаику (drag/drop) ? Получается есть 2 прямоугольника (которые надо перетаскивать)  и есть ещё 2 прямоугольника (которые должны принимать) и ещё есть кнопка проверки. При нажатии определяет правильно ли разместили прямоугольники.
    • От SIARHEI RAHOUSKI
      Как задать градиентную заливку TChart? именно самих столбцов. 

    • От SIARHEI RAHOUSKI
      При нажатии на Label действия не происходят
      procedure TForm2.Label11Click(Sender: TObject);
      begin
      Button1.visible:= true;
      {label7.Font.Style:= [];
      label8.Font.Style := [];
      label9.Font.Style := [];
      //label11.Font.Style := [fsbold];
      label10.Font.Style := [];  }

        GroupBox12.Visible := false;
        GroupBox13.Visible := false;
        GroupBox14.Visible := false;
        GroupBox15.Visible := true;
        GroupBox16.Visible := false;
      end;
    • От Вадим Смоленский
      В декабре я задавал здесь вопрос о борьбе с перехватами нажатий клавиш компонентом TWebBrowser. Продвинутый пользователь Kami посоветовал тогда, раз уж меня интересует только Windows, поставить хук на клавиатуру. Поделился полезной ссылкой. Добавил, что можно еще много чего нагуглить. Что-то действительно нагуглилось - но не в том объеме, чтобы я смог четко понять, как это следует делать. Вопросов много. Куда именно должна быть воткнута функция KeyboardProc? Что в ней должно содержаться, чтобы управление передавалось уже написанному обработчику события FormKeyDown? Многие также упоминают о возникающих проблемах с юникодом, и хорошо было бы понять, как уберечься от них.
      Буду очень признателен, если кто-нибудь осветит эту темную для меня материю.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу