Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


Pax Beach

Вопрос

Мне нужно сделать снимок экрана из своего приложения в приложении 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
Ссылка на комментарий

Рекомендуемые сообщения

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

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

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

 

Ссылка на комментарий
  • 0

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

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

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

 

Ссылка на комментарий
  • 0
4 минуты назад, Rusland сказал:

тогда ой )

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

Ссылка на комментарий
  • 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
Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...