Как работают сторонние наложения поверх приложений OpenGL и Direct3D? [Дубликат]

Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:

Вы пытаетесь использовать ссылочную переменную, значение которой Nothing / null. Если для ссылочной переменной значение Nothing / null, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.

Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную Nothing / null, или вы вызывали функцию, которая установите для этой переменной значение Nothing / null.

37
задан Lodle 5 December 2010 в 08:35
поделиться

4 ответа

therers - проект бесплатного программного обеспечения, его название - taksi текст ссылки . я не уверен, как это приложение переопределяет процесс, потому что я еще не изучаю код, но checkit, я думаю, что это хороший проект

2
ответ дан Car 4 September 2018 в 09:57
поделиться

Я сделал наложения как с DirectX & amp; Визуализации WPF (то же самое, на самом деле), используя наложение для рисования некоторых приятных 2D-материалов GDI + поверх 3D-визуализации.

Мне удалось использовать панель поверх «фактической» визуализации, установив цвет до прозрачности, за исключением бит, который я хотел наложить. Работала неплохо, но это было немного боль, проходящая щелчок, перетаскивание и другие события через слой «рисования» в 3D-управление.

-1
ответ дан moobaa 4 September 2018 в 09:57
поделиться

Создал Gist с полным кодом здесь

Это довольно эзотерическое искусство, и есть несколько способов сделать это. Я предпочитаю то, что называется Direct3D Wrapper . Прошло много лет с тех пор, как я это сделал, но однажды сделал это с игрой. Я, возможно, отказался от некоторых деталей, но я просто надеюсь проиллюстрировать эту идею.

Все игры Direct3D9 необходимо вызвать IDirect3DDevice9 :: EndScene после отображения экрана и быть готовым к тому, чтобы нарисован. Поэтому теоретически мы можем поместить пользовательский код внутри EndScene, который рисует то, что мы хотим по игре. Мы делаем это, создавая класс, который похож на IDirect3DDevice9 на игру, но на самом деле это всего лишь оболочка, которая пересылает все вызовы функций в реальный класс. Итак, теперь в нашем пользовательском классе наша оберточная функция для EndScene выглядит так:

HRESULT IDirect3DDevice9::EndScene()
{
   // draw overlays here

   realDevice.EndScene();
}

Затем мы скомпилируем ее в DLL, называемую d3d9.dll, и поместим ее в каталог исполняемого файла игры. Реальный d3d9.dll должен находиться в папке / system32, но игра сначала выглядит в текущем каталоге и вместо этого загружает наши. Как только игра загружается, она использует нашу DLL для создания экземпляра нашего класса-оболочки. И теперь каждый раз, когда вызывается EndScene, наш код выполняется, чтобы нарисовать то, что мы хотим на экране.

Я думаю, вы можете попробовать тот же принцип с OpenGL. Но чтобы предотвратить фальсификацию, я думаю, что некоторые современные игры пытаются предотвратить это.

19
ответ дан Shaun Lebron 4 September 2018 в 09:57
поделиться

Я думал об этом. Для OpenGL я бы закрепил SwapBuffers WGL с помощью Detours, рисовал мои вещи после игры, а затем сам менял буферы.

0
ответ дан user 4 September 2018 в 09:57
поделиться
Другие вопросы по тегам:

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