Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с видеопамятью 
:(
    Опции темы
p0s0l
Дата 5.8.2005, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



Цитата(JoyEx @ 5.8.2005, 08:02)
1) Если будет fatal error LNK1181: cannot open input file 'Strmbase.lib'
Я так-то прогаю в Delphi, и меня интересуют не проблемы компилирования в VC, а способ решения задачи - как заграббить содержимое оверлея, созданного чужим (любым) процессом... Я так понял, ты описал способ, как заграббить содержимое оверлея при проигрывании фильма своим же процессом через DirectShow ?... Если неправильно тебя понял, то приведи плиз полный исходный код, если несложно...
А те 4 примера, что ты привел не работают для этой цели...
Первый пример - не то чтобы не граббит оверлеи, он даже из фильма не хочет грабить (запускал готовый .exe), да и причем здесь фильм ? smile, из названия понятно, что это не то что нужно.
Второй и третий пример - это получение изображений с различных устройств. Или есть возможность захватить то, что идёт на монитор ? Вряд ли... (эти примеры не стал пробовать...)
Четвертый пример - автор даже не упомянул об оверлеях... Впрочем, для пущей убедительности, я навсякий случай скачал пример и запустил - оверлеи не граббятся...

Цитата(JoyEx @ 5.8.2005, 08:02)
p0s0l
У тебя получается как в анекдоте, в военкомате:
Анекдот конечно смешной, но попрошу потактичнее общаться на форуме, есть правила поведения. Непонятно, как расценивать это анекдот относительно меня: то ли я слепой, то ли я претворяюсь слепым... Ни то, ни другое мне неприятно... Но на первый раз пока выставлять предупреждение тебе не буду, т.к. я не очень обидчивый smile.


--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 6.8.2005, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



p0s0l

Самый простой вариант это перехватить API-вызов DirectDrawCreate() в чужом (или своём) процессе и тем самым получить интерфейс IDirectDraw, а затем можно с помощью lpDirectDraw->EnumSurfaces() найти оверлейную поверхность и lpDDSurface->GetDC (&hdc). Всё! Имея HDC оверлея делай чё хочешь smile

Если это подходит, то завтра дам пример.

PS Чё "бородатый" анектод рассказать нинзя?!



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
JoyEx
Дата 6.8.2005, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



А в том примере №1, если не исправить ошибку (в п.4 я говорил уже о ней), то ничего не будет работать у "родного" FrameGrabberDemo.exe.


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
p0s0l
Дата 7.8.2005, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



Цитата(JoyEx @ 6.8.2005, 22:03)
Самый простой вариант это перехватить API-вызов DirectDrawCreate() в чужом (или своём) процессе и тем самым получить интерфейс IDirectDraw, а затем можно с помощью lpDirectDraw->EnumSurfaces() найти оверлейную поверхность и lpDDSurface->GetDC (&hdc). Всё! Имея HDC оверлея делай чё хочешь
Подобная идея была уже у Олега, но имхо этот способ не катит, т.к. требуется сделать снимок экрана в данный момент, а чужие процессы могли создасться до нашего процесса. Реально задача может решиться, если каким-то образом быстро получить все интерфейсы директдрава всех процессов, но не через перехват DirectDrawCreate... Или напрямую с видяхой общаться, что так-то очень извратно...

Цитата(JoyEx @ 6.8.2005, 22:03)
Если это подходит, то завтра дам пример.
Не пример не надо, это не подходит smile


--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 7.8.2005, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



P0S0L

Если в kernel-mode лезть, то тогда можно: хучить в VideoPort драйвере DriverInit(,DataPointer ,), из DataPointer получишь адреса DdUpdateOverlay(), DdXXX и т.п...

Цитата(p0s0l @ 7.8.2005, 10:22)

Цитата(JoyEx)

Если это подходит, то завтра дам пример.

Не пример не надо, это не подходит


И всё же smile
Посмотри аттачи, там мой bin1.zip и bin2.zip (для WinXP) – там loader.exe запускает overlay.exe и грузит в него spy.dll, которая перехватывает вызов DirectDrawCreate()¸тоже самое можно сделать и с CoCreateInstance(), а чтобы не пропустить более ранние процессы надо "пораньше вставать".

Это сообщение отредактировал(а) JoyEx - 8.8.2005, 13:40

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  bin1.zip 31,80 Kb


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
JoyEx
Дата 7.8.2005, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Вот второй .zip

Это сообщение отредактировал(а) JoyEx - 8.8.2005, 13:40

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  bin2.zip 17,33 Kb


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
p0s0l
Дата 7.8.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



За старания, конечно, спасибо! Я б и сам давно уже накатал бы, но это не катит, как я и говорил уже. Вставать пораньше не годиться... Вернее, это годиться, но не для всех задач...
Если уж вставать по-раньше, то проще вначале создать оверлейную поверхность, тогда уже другие программы будут обходиться без неё smile...
(это конечно шутка!)

PS: Архивы я скачал, но как там хоть какой-то результат-то получить ? smile Запустил значит Loader, ничего не происходит, а дальше чего ? smile Хотя в принципе это не важно...

В кернел моде хучить - тоже плохой выход smile (не лучше, чем DirectDrawCreate перехватывать)


--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 7.8.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Цитата(p0s0l @ 7.8.2005, 14:24)
PS: Архивы я скачал, но как там хоть какой-то результат-то получить ?  Запустил значит Loader, ничего не происходит, а дальше чего ?  Хотя в принципе это не важно...


- Перед запуском Loader.exe не должен быть запущен overlay.exe, а если overlay.exe не может создать оверлей, то тогда закрой, например, проигрыватель с оверлеем или типа того. В Win9X мой пример работать не будет.

Это сообщение отредактировал(а) JoyEx - 7.8.2005, 15:27


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
p0s0l
Дата 7.8.2005, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



Я так-то сразу и запускал loader... Щас убедился, что в процессах нет overlay.exe, запустил loader. Проигрыватели не запущены...
Лучше скажи, что я должен увидеть ? smile
Когда запускаю лоадер, в процессах на долю секунды появляется overlay.exe и исчезает...
У меня WinXP...



--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 7.8.2005, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



overlay.exe создает в левом-верхнем углу оверлей типа "Hello, P0S0L! ...", а когда запускаешь через loader.exe - грузится spy.dll (через CreateRemoteThread()), вот она и подменяет адрес ф. DirectDrawCreate() на свой (в таблице импорта overlay.exe) и ждет, когда будет вызов DirectDrawCreate(). Ну вот, когда overlay.exe обратится к DirectDrawCreate(), то попадет в spy.dll и примерно через 1 сек. в оверлее меняется надпись на "Hello from Spy.dll".

p0s0l, тысяча извинений! Я там перепутал первую букву. smile пиво... блин

Уже исправил и переаттачил zip-ы.

Это сообщение отредактировал(а) JoyEx - 7.8.2005, 17:00


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
p0s0l
Дата 7.8.2005, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



JoyEx, сейчас вроде получше, я хоть что-то вижу smile
Во, выдаёт:
smile

Присоединённый файл ( Кол-во скачиваний: 39 )
Присоединённый файл  err.gif 4,31 Kb


--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 7.8.2005, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Завтра вечером исправлю smile


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Leksey
Дата 7.8.2005, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



p0s0l и
JoyEx я надеюсь ,что не помешаю вам. smile
Написал два теста.
Один на DirectX, другой WinAPI:
WinAPI
Код

//hScreenDC-десктоп
//hMemDC-совместимый с hScreenDC
//stream обертка над API для работы с Avi файлами
  while (count<100)
  {
      count++;
      BitBlt(hMemDC,0,0,width,height,hScreenDC,0,0,SRCCOPY);
           GetDIBits(hMemDC,hBit,0,bmpInfo.bmiHeader.biHeight,buff,&bmpInfo,DIB_RGB_COLORS);
      stream.AddFrame(buff,FrameSize);
      Sleep(40);
  }

DirectX
Код

//lpDDS-внеэкранная поверхность в видео памяти
//lpDDSurface-первичная поверхность-рабочий стол
  while (count<100)
  {
      count++;
      lpDDS->BltFast(0,0,lpDDSurface,0,DDBLTFAST_WAIT|DDBLTFAST_NOCOLORKEY);
           lpDDS->Lock(0,&ddsd,DDLOCK_WAIT,0);
      stream.AddFrame(ddsd.lpSurface,ddsd.lPitch*ddsd.dwHeight);
           lpDDS->Unlock(ddsd.lpSurface);
      Sleep(40);
  }

Как вы думаете какой быстрее работает?
А вот и не угадали!!!
Быстрее работает первый!
Может кто-нибудь сможет объяснить?
PM MAIL   Вверх
ManiaK
Дата 8.8.2005, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Цитата(Leksey @ 7.8.2005, 23:45)
p0s0l и JoyEx я надеюсь ,что не помешаю вам.

Автор топика имеет полное право требовать закрытия флейма. Но мне показалась их беседа полезна - вдруг, наконец, решат?.. smile

Мне кажется тут из разряда "кувалдой кнопки вбивать". Скопировать изображение с рабочего стола, что на WinAPI, что на DX - одно и тоже. Никаких вычислений не требуется. Но в DX может быть куча всего, что тормозит в прогах вроде твоей. Первое, что бросается в глаза - вызовы функций Lock/Unlock. Даже если время на их вызов тратится незначительное при твоей скорости сканирования экрана это может оказаться весомым тормозом.
PM MAIL WWW   Вверх
JoyEx
Дата 8.8.2005, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Leksey
Всё зависит от того, где размещены hMemDC и lpDDS. Если в системной памяти, то будет медленно, а если в видеопамяти – быстро, а самое главное - DirectX может сделать синхронизацию по кадрам (VSync!). Попробуй Lock/Unlock сделать вне while.

p0s0l
Я уже исправил и переаттачил zip-ы.


Это сообщение отредактировал(а) JoyEx - 8.8.2005, 14:55


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.