Берем произвольно любое D3D приложение. Запускаем (в окне).
1. Можно ли это окно сделать невидимым, так чтобы приложение этого не заметило и продолжало спокойно работать?
2. Можно ли произвести захват картинки из такого (скрытого) окна?
3. Можно ли посылать в него события от клавы/мышки?
Прошу ответить, возможно ли это? И посоветовать, где/что почитать по реализации данных вещей. Спасибо.
ЗЫ. Исходников приложения, естественно, не имеется.
Здравствуйте, ProtecT, Вы писали:
PT>Берем произвольно любое D3D приложение. Запускаем (в окне). PT>1. Можно ли это окно сделать невидимым, так чтобы приложение этого не заметило и продолжало спокойно работать? PT>2. Можно ли произвести захват картинки из такого (скрытого) окна? PT>3. Можно ли посылать в него события от клавы/мышки?
PT>Прошу ответить, возможно ли это? И посоветовать, где/что почитать по реализации данных вещей. Спасибо.
PT>ЗЫ. Исходников приложения, естественно, не имеется.
1. ShowWindow(SW_HIDE);
2. Да. Окно здесь не нужно, т.к. рендер идёт в поверхность
3. Разумеется. SendMessage() или PostMessage()
Здравствуйте, ProtecT, Вы писали:
PT>2. Можно ли произвести захват картинки из такого (скрытого) окна? PT>3. Можно ли посылать в него события от клавы/мышки?
Передо мной пример подобного захвата (ссылка1ссылка2) Здесь всё реализовано на перехватах API. И таких примеров в google code достаточно много — легко находятся по ключевым словам DETOUR_TRAMPOLINE и DirectX/DirectSound/D3D
Соответственно события клавиатуры-мыши можно посылать, делая вызовы к родным интерфейсам.
Скрыть окно наверняка можно, однако предполагаю некоторые трудности — приложение ведь может работать с главной поверхностью (primary surface).
А какая конечная цель вопроса — может быть найдутся способы решить проще?
CTH>А какая конечная цель вопроса — может быть найдутся способы решить проще?
Цель: Запуск ресурсоемких/тяжелых 3D приложений на мощной графической станции (q6600/9800GTX) и трансляция видеопотока легким клиентам по локалке (1 Gbit). Возможен запуск нескольких 3D приложений одновременно.
Что нужно:
1. запустить в скрытом (в худшем случае — свернутом) состоянии 3D приложение. Так, чтобы компьютером можно было бы пользоваться.
2. захватывать картинку с его окна и сохранять в файл/транслировать в сеть.
3. Передавать в запущенное приложение управляющие последовательности (с клавы/мыши)
Здравствуйте, ProtecT, Вы писали:
PT>Берем произвольно любое D3D приложение. Запускаем (в окне). PT>1. Можно ли это окно сделать невидимым, так чтобы приложение этого не заметило и продолжало спокойно работать? PT>2. Можно ли произвести захват картинки из такого (скрытого) окна? PT>3. Можно ли посылать в него события от клавы/мышки?
PT>Прошу ответить, возможно ли это? И посоветовать, где/что почитать по реализации данных вещей. Спасибо.
PT>ЗЫ. Исходников приложения, естественно, не имеется.
В общем случае вряд ли. Потому что:
1. При скрытии окна правильные приложения прекращают рендеринг (окно получает нотификации). Конечно, можно попробовать захучить этот момент, но это может нервировать антивирус...
2. Если обойти (1), то не думаю, что будут какие-то проблемы.
3. Тут очень вероятна засада с DI, ибо оно позволяет эксклюзивный захват устройств ввода. И самое плохое для вас, что эта техника используется в 9 из 10 DI-enabled приложений. Обойти можно разве что сварганив драйвер и посылая сообщения оттуда. Дело в том, что DI читает данные напрямую из драйвера (так сделано по соображениям производительности), и перехватить это дело в юзермоде весьма сложно (ну конечно можно весь DI прохучить, но это-то уж точно не понравится антивирусу, да и вылезет проблема портабельности — 32/64 бита).
Bottom line таков: сделать то, что вы задумали, реально, но очень вероятен сильный гемор в частностях
Здравствуйте, ProtecT, Вы писали:
CTH>>А какая конечная цель вопроса — может быть найдутся способы решить проще?
PT>Цель: Запуск ресурсоемких/тяжелых 3D приложений на мощной графической станции (q6600/9800GTX) и трансляция видеопотока легким клиентам по локалке (1 Gbit). Возможен запуск нескольких 3D приложений одновременно.
А чем обычный ремут десктоп не подходит?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Real Programmers don't comment their code. If it was hard to write, it should be hard to understand.