![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вывод "поверх" игры [Delphi, Windows]
Luka.rus © (2006-04-19 15:57:00)в общем, всегда интерисовался, как можно вывести графику поверх уже запущенной игры, как это делает, например, fraps. да и многие другие программы.
если есть примеры, поделитесь. нет, тогда давайте обсудим, может сможем реализовать это.
также меня смущает то, то тот же Фрапс выводит поверх практически любой игры, независимо OpenGL или Direct3D..
Galiaf (2006-06-07 05:12:00) [1]Возможно я ошибаюсь но можно взять хэндл дэсктопа и прям на нём рисовать.
procedure TForm2. Button2Click(Sender: TObject);
var
dc: HDC;
begin
dc: = GetDC (0); // получаю ссылку на рабочий стол
Rectangle (dc, 10, 10, 110, 110);
ReleaseDC (Handle, dc);
DeleteDC (DC);
end;
- это Краснов писал, когда я пробовал, вывело мне квадратик прям поверх программы, сейчас точно не помню, так просто мысль выложил.
XProger (2006-05-30 23:01:00) [2]Удалено модератором
Лопух (2006-05-30 22:52:00) [3]Удалено модератором
Примечание: Создание пустых сообщений
Sapersky (2006-04-20 19:24:00) [4]Если не на ddraw/dshow, то обычным методом - GetDC/BitBlt.
Кстати, BitBlt неплохо работает и в D3D (быстрее, чем GetFrontBuffer/GetBackBuffer). Во всяком случае, если вызывать "изнутри", из внедряемой DLL то есть.
Pa5ha (2006-04-20 17:23:00) [5]Вы не вкурили. Я к тому, что все, что здесь обсуждается по поводу перехвата свапа и endscene к фрапсу не относится и работает он по другому т.к. видео из проигрывателей он тоже грабит. Конечно, если все проигрыватели написаны на ddraw, то вопросов больше не имею.
Nic (2006-04-20 09:54:00) [6]Luka.rus (20.04.06 00:30) [12]
Direct Draw/Direct Show.
XProger (2006-04-20 00:56:00) [7]Luka.rus, это зависит от настроек в свойствах проигрывателя ;)
Luka.rus (2006-04-20 00:30:00) [8]windows media player, насколько мне известно не использует ни ОГЛ ни Д3Д, хотя бы потому, что это библиотеки для работы в 3Д.
для вывода видео он иногда использует Директ. но не всегда, мне кажется это зависит от кодека.
Fosgen (2006-04-19 21:30:00) [9]Это конечно вопрос: "а WINDOWS media player на чем писан?" А что, кто-то допускает мысль о windows писанной на OpenGL? Это что-то из разряда: "А машины у сотрудников в Microsoft на чем работают - на Windows или Linux?"
Pa5ha (2006-04-19 20:46:00) [10]А windows media player на D3D или на OpenGL написан? :) Там ведь тоже фпс выводится и картинки с оверлея пизяца. Правда, в WinDVD некорректно.
Cash (2006-04-19 19:39:00) [11]С опеновскими штуками - согласен с XProger-ом, токма шприц и иньекцию
придется делать.
А для D3D есть в SDK длл-ка, называется d3dspy@.dll (где @-версия SDK),
ее можно подключть к себе и пользовать полномоштабный перехват
интерфейсов.
Дожидаемся когда срабатывает EndScene у девайса и рендерим все, что
душе только заблагорассудится.
Sapersky (2006-04-19 19:15:00) [12]...или в случае D3D - Present/EndScene.
Теория внедрения/перехвата - см. книгу Рихтера, в электронном виде должна быть здесь: http://rouse.front.ru/
Или статьи на wasm.ru:
http://www.wasm.ru/article.php?article=apihook_1
Библиотека madCodeHook:
http://www.madshi.net
Есть пример включения wireframe в D3D играх.
XProger (2006-04-19 19:04:00) [13]http://www.yandex.ru/yandsearch?serverurl=gamedev.ru&text=Fraps
XProger (2006-04-19 18:51:00) [14]Перехватываем SwapBuffers...
Luka.rus (2006-04-19 18:20:00) [15]вот этот код дает мерцание. даже если ФПС 60, в Варкрафте3:
stop:= false;
bmp:= TBitmap.Create;
whd:= FindWindow('Warcraft III', nil);
bmp.Canvas.Handle:= GetDC(whd);
while not stop do begin
bmp.Canvas.Draw(100,100, Image1.Picture.Graphic);
Application.ProcessMessages;
end;
теоретически он довольно часто должен рисовать :(
Luka.rus (2006-04-19 18:12:00) [16]дело в том, что игровое окно обновляется очень быстро, у меня в некоторых играх ФПС больше 1000. нам надо рисовать с частотой в несколько раз превышающей ФПС, и даже так скорее всего будет мерцание..
Старик (2006-04-19 18:05:00) [17]берем GetDC нужного окна и рисуем на нем квадратики.
способ примитивен. единственное, что стоит обдумать, это как сделать, чтобы наше рисование было поверх игрового.
Luka.rus (2006-04-19 17:30:00) [18]врядли. если создать много окон, то он будет писать в каждое из них отдельно :( как же они это делают..
Pa5ha (2006-04-19 17:15:00) [19]Возможно он использует оверлей. Он ведь один :) Если занят, то выводит на оверлей. Чиста гипотеза.