Ответ 1
Чтобы захватить окна Direct3D, которые находятся в фоновом режиме (или отключены от экрана), я считаю, что у вас есть следующие возможности:
-
Внесите и перетащите Direct3D в целевое приложение по уже опубликованной ссылке или этот более современный пример ( EasyHook может быть трудно получить настройку, но она действительно работает очень хорошо) - вы всегда можете попросить о помощи в ее работе. Я использовал эту технику для захвата в нескольких играх без проблем (совсем недавно для проекта, созданного с помощью amilight-clone). Проблема с этим подходом заключается в том, что ваша проблема связана с защитой игры, вызывающей запреты, однако FRAP также использует привязку для достижения этой цели, поэтому, возможно, ваши проблемы преувеличены? Я думаю, что геймеры, запрещенные для снятия экрана, являются дорогостоящим способом узнать.
-
Для оконных приложений в Vista/Win 7 вы можете вводить и подключать DWM и делать запросы на захват через свою общую поверхность. У меня был этот работающий на Vista, но он не закончил работу над Windows 7, вот пример его работы для Windows 7 http://www.youtube.com/watch?v=G75WKeXqXkc. Основная проблема с этим подходом заключается в использовании недокументированного API, который может означать, что ваше приложение прерывается без какого-либо предупреждения при выпуске патчей Windows. Также вам придется переделать технику для каждого нового основного вкуса Windows. Это также не касается необходимости захвата в Windows XP.
-
Также в DWM есть API-интерфейс миниатюр. Это имеет ограничения в зависимости от того, что вы пытаетесь сделать. Здесь есть информация об этом API вместе с другим DWM API http://blogs.msdn.com/b/greg_schechter/archive/2006/09/14/753605.aspx
-
Существуют и другие способы перехвата вызовов Direct3D без использования EasyHook, например, замена различных DLL-оболочками. Здесь вы найдете различные методы перехвата/перехвата игры: http://www.gamedeception.net/
-
Просто принесите приложение Direct3D на передний план (что, как я полагаю, нежелательно в вашей ситуации) - это не будет работать для окон вне экрана, если вы также не переместите окно.
-
К сожалению, единственным решением для Windows XP, о котором я могу думать, является перехват Direct3D API в той или иной форме.
Просто уточнение рендеринга Direct3D и минимизация. Во время моего довольно ограниченного тестирования по этому вопросу я нашел, что это зависит от приложения; обычно не рекомендуется, чтобы рендеринг выполнялся, когда приложение сведено к минимуму (также этот ссылка), он продолжает отображаться в фоновом режиме.
ОБНОВЛЕНО: добавлена дополнительная ссылка на более современный пример инъекции для точки 1.