Подтвердить что ты не робот

Наложение на трехмерное полноэкранное приложение

Я хочу отобразить некоторые пользовательские графики поверх стороннего полноэкранного приложения Windows.

Вы играли в Steam-игры? Он имеет исполняемый файл GameOverlayUI.exe, который позволяет вам получать доступ к окнам Steam из игры. (Элементы GUI выглядят индивидуально, я не знаю, нужна ли это необходимость, но они выглядят точно так же внутри игры, как и на рабочем столе.) Даже для того, чтобы "затушить" игровую графику фон.

Мне интересно, как можно писать такое приложение.

Мне также интересно, насколько широким будет объем решений. Можете ли вы использовать один метод для всех приложений OpenGL? Для всех Direct3D минус приложения DirectDraw? Для всех полноэкранных приложений Windows?

Я ищу более "современные" и общие решения - наложение командной строки или приложение с индексированным цветом 320x240 не вызывает беспокойства.

Изменить: некоторые пояснения: полноэкранное приложение не мое. Это может быть что угодно. Скорее всего, это будет 3D-игра. Я хочу показать, например, цифровые часы в правом нижнем углу экрана, поверх игровой графики. Я хотел бы избежать трюков, таких как ввод кода или отладка процесса, если это возможно.

4b9b3361

Ответ 1

Ну, вот еще один пример. Xfire - это чат-программа, которая накладывает свой интерфейс на игры, чтобы вы могли получать сообщения во время игры. То, как они это делают, - это отредактировать DLL d3d/opengl на уровне памяти процесса, например, впрыскивать сборочные сборки. Я знаю это, потому что их метод вызывал мой мод, и я действительно видел странный код сборки, который они вставляли в d3d9.dll.

Итак, как это делает Xfire:

  • настроить процесс игры
  • найдите свою память процесса для d3d.dll/opengl.dll
  • внедрить в процесс DLL, содержащую логику пользовательского интерфейса.
  • связывать функции интерфейса с потоком программы, вручную записывая сбои сборки в функциях d3d/opengl, найденных в памяти процесса.

Нет другого мыслимого способа, поскольку вам нужно захватить графическое устройство, принадлежащее этой игре. Я готов поспорить, что Steam делает это так же, как Xfire. Так что да, нет простого способа сделать это, если кто-то не создал полезную библиотеку, чтобы делать все, что вам нужно делать на низком уровне.

Вы также спросили о том, как затемнить графику игры под вашим оверлеем. Это просто простой вызов DrawPrimitive для рисования заполненного прозрачного прямоугольника над экраном.

Ответ 2

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

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

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

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

   realDevice.EndScene();
}

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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