PDA

Просмотр полной версии : Скриншот окна содержащего рендерер (D3D, OpenGL, etc)


BotLegacy
12.06.2012, 21:29
BitBlt делает снимок экрана, а не окна.
PrintWindow возвращает квадрат малевича, т.к. рендереры срали на WM_PRINT, а PrintWindow это по сути оболочка для WM_PRINT http://msdn.microsoft.com/en-us/library/windows/desktop/dd162869%28v=vs.85%29.aspx The application that owns the window referenced by hWnd processes the PrintWindow call and renders the image in the device context that is referenced by hdcBlt. The application receives a WM_PRINT message or, if the PW_PRINTCLIENT flag is specified, a WM_PRINTCLIENT message. For more information, see WM_PRINT and WM_PRINTCLIENT.
Примерно год назад нашёл функцию, которая без инжектов и внедрения в DX делала скриншот именно с окон содержащих рендерер и с окон веб-браузеров. К сожалению потерял её - когда менял ноут на новый комп, забыл снять с него старые проекты.

J-Fobos
12.06.2012, 21:43
Гугл не модный нынче :) http://www.kansoftware.ru/?tid=1293

BotLegacy
12.06.2012, 22:24
J-Fobos
Ты хоть смотрел, что по твоей ссылке? Или первую попавшуюся из гугла скопирнул чтоб выебнуться?

Добавлено через 34 минуты
Пойду спать.
Yegor, жду ваш код где PrintWindow скриншотит. Защит никаких не было и нету.

Yegor
13.06.2012, 00:32
function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: UINT): BOOL; stdcall; external user32;


function GetWindowBitmap(hw: HWND): TBitmap;
var
wHeight, wWidth: word;
rect: TRect;
begin
Result:= nil;
if GetWindowRect(hw, rect) then
begin
Result:= TBitmap.Create;
wWidth:= rect.Right - rect.Left;
wHeight:= rect.Bottom - rect.Top;
Result.Width:= wWidth;
Result.Height:= wHeight;
PrintWindow(hw, Result.Canvas.Handle, 0);
end;
end;

BotLegacy
13.06.2012, 09:50
Yegor, отличные сказки вы рассказывайте.
http://rghost.ru/38633409/image.png
http://forum.sources.ru/index.php?showtopic=358776
И не надо нести откровенный бред про защиты - нету никакой защиты, эта функция с любой игры возвращает квадрат малевича - хоть с Пиратов Карибского Моря, хоть с эмулятора Сеги, хоть с веб-браузера.

mira
13.06.2012, 11:34
Ну я делал както так (других надежных способов ненашол, может и есть).

перехватываем создание интерфейса директх-девайса и при создании добавляем флаг LOCKAВLE_ВACKBUFFER иначе мы не получим к нему доступ. Запоминаем созданый экземпляр.

когда нам нужно получить отрендереный имадж - вызываем метод idirect3ddevice9 возвращающий интерфейс бекбуфера. Там 2 способа считать его - создать hdc и отблитить либо залочить и скопировать массив пикселей.

мб чето я перепутал но суть такая, и у меня работало у меня

Добавлено через 15 минут
Без инжектов хз ваще как получить доступ к буферу в неактивном окне. Контекст окна 1 фиг нам бесполезен.

Добавлено через 33 минуты
Printwindow ясен пень не будет работать так как обращаетса к gdi. Рендеры же работают конкурентно с гди и пересекаютса тока на экранной поверхности. Им пох на то что рисует само окно, а оно обычно в играх ниче не рисует вот, и квадрат малевича.

Yegor
13.06.2012, 14:10
Возможно зависит от ОС у меня Win7, результат во вложении.

На всяк случай попробуйте получить моей демо программой (во вложении)

Anfet
13.06.2012, 14:14
перехватываем создание интерфейса директх-девайса и при создании добавляем флаг LOCKAВLE_ВACKBUFFER иначе мы не получим к нему доступ. Запоминаем созданый экземпляр.
Самое интересное, что этот флаг вообще не гарантирует то, что доступ можно будет получить.
А потом начинается веселье с тем что тебе нужно забрать буфер, а он тоже далеко не всегда (почему-то) может быть доступен.

А вообще мира правду говорит. Неактивное окно не заскринить просто так.
(я уже на этом съел собаку).

Yegor
13.06.2012, 14:17
mira, с помощью твоего метода и в свернутом окне можно получить скрин и оно получит именно новую отрендеренную картинку или последнюю которая рендерилась до сворачивания?

Anfet
13.06.2012, 14:19
mira, с помощью твоего метода и в свернутом окне можно получить скрин и оно получит именно новую отрендеренную картинку или последнюю которая рендерилась до сворачивания?
Свернутое окно вообще не рендерится (если мы о ла2).

Yegor
13.06.2012, 14:33
Anfet, может как то можно заставить движок отрендерить кадр как будто бы окно развернуто.

mira
13.06.2012, 15:01
Свернутое окно вообще не рендерится (если мы о ла2).

угу там вроде экземпляр рендера (3ддевайс) переходит в состояние devicelost и при разворачивании требует переинициализации.

Добавлено через 7 минут
Anfet, может как то можно заставить движок отрендерить кадр как быдто бы окно развернуто.

Устойство переходит в состояние "потеряно" стало быть не может ничего.

Добавлено через 8 минут
Самое интересное, что этот флаг вообще не гарантирует то, что доступ можно будет получить.
А потом начинается веселье с тем что тебе нужно забрать буфер, а он тоже далеко не всегда (почему-то) может быть доступен.

А вообще мира правду говорит. Неактивное окно не заскринить просто так.
(я уже на этом съел собаку).

1)если адаптер не поддерживает запираемый бекбуфер
2)если пытатса его захватывать не синхронно а например между beginscene и endscene скорей всего будет фейл.
В идеале его захватывать перед самим методом present.

ну и да...
Начиная с висты немного поменялась идеология оконых контекстов. Там принт возможно прокатит.