Скриншот с фильмы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Скриншот с фильмы

Сообщение MOV » 10.07.2004 (Сб) 15:49

Просто интересно как сделать скриншот с фильма при показе его в полоэкранном режиме? Принт-скрином как известно, получаются, черные снимки. Может у кого есть исходник на ASM-e :D ? (там я думаю, это можно замутить и ничто не сможет помешать :shock: :D).
И в чем вообще суть? Почему так получатеся? Неужели типа защита стоит?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.07.2004 (Сб) 16:23

Суть в том, что оверлей не принтскринится. Проги есть для этого.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 10.07.2004 (Сб) 16:58

Ясно. Короче, надо типа захватить этот поток и только тогда может что-то получится так? :?
Не знаю технологию принтскрина, но все -таки. Вот если взять и просто снять снимок непосредственно со страницы экранной памяти?
Если принтскрин делает именно так (а по другому я не представлю), то тогда тему можно закрыть.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 10.07.2004 (Сб) 19:32

Я юзаю для этого Hypersnap DX, он все снимает. Кстати для захвата он юзает ф-цию DirectDrawCreateEx и еще несколько ф-ций из своего модуля. :idea:

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Re: Скриншот с фильмы

Сообщение Approximator » 11.07.2004 (Вс) 3:34

MOV писал(а):Просто интересно как сделать скриншот с фильма при показе его в полоэкранном режиме? Принт-скрином как известно, получаются, черные снимки. Может у кого есть исходник на ASM-e :D ? (там я думаю, это можно замутить и ничто не сможет помешать :shock: :D).
И в чем вообще суть? Почему так получатеся? Неужели типа защита стоит?


Так уж и на ASM'е? :) :) :) Нет там никакой защиты :) :) :) Если не получилось "принтскрином" это ещё не диагноз... в чём проблема? Хапай DC экрана (разумеется, в тот момент, когда у тебя полнокранный режим) и BitBlt его в CompatibleDC, с которого в свою очередь на форму, а с формы в файл (можно сразу с экрана в файл, короче, всё зависит от "фантазии"). Вот я накропал элементарный пример, поясняющий суть:

Код: Выделить всё
Dim mDC As Long, sDC As Long, i As Long, lDo As Boolean, lObj As Long
Dim lBFP As String

Private Sub Form_Click()
Do
  DoEvents
  If lDo Then
   mDC = GetDC(0)
   sDC = CreateCompatibleDC(mDC)
   lBFP = "c:\SSH" & Format(Now, "YYYY.MM.DD.hh.mm.ss") & ".bmp"
   SavePicture Me.Image, lBFP
   lObj = SelectObject(sDC, LoadPicture(lBFP))
   DeleteObject lObj
   BitBlt sDC, 1, 1, 1600, 1200, mDC, 1, 1, cvAPIBBcSrcCopy
   BitBlt Me.hDC, 1, 1, 1600, 1200, sDC, 1, 1, cvAPIBBcSrcCopy
   Me.Refresh
   lBFP = "c:\SSH" & Format(Now, "YYYY.MM.DD.hh.mm.ss") & ".bmp"
   SavePicture Me.Image, lBFP
   Debug.Print lBFP
   lDo = False
  End If
Loop
End Sub

Private Sub Form_Load()
Me.AutoRedraw = True
End Sub

Private Sub Tim_Timer()
lDo = True
End Sub


Проверял как при полноэкранном режиме TV-тюнера, так и при DVD-поигрывателе... а что ещё может быть нужно...

P.S. ScaleMode установи в пиксели... для наглядности используй WindowState = Maximized, ну и белый фон... :) :) :)
С уважением, Approximator.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Re: Скриншот с фильмы

Сообщение GM » 11.07.2004 (Вс) 6:30

Approximator писал(а):
MOV писал(а):Просто интересно как сделать скриншот с фильма при показе его в полоэкранном режиме? Принт-скрином как известно, получаются, черные снимки. Может у кого есть исходник на ASM-e :D ? (там я думаю, это можно замутить и ничто не сможет помешать :shock: :D).
И в чем вообще суть? Почему так получатеся? Неужели типа защита стоит?


Так уж и на ASM'е? :) :) :) Нет там никакой защиты :) :) :) Если не получилось "принтскрином" это ещё не диагноз... в чём проблема? Хапай DC экрана (разумеется, в тот момент, когда у тебя полнокранный режим) и BitBlt его в CompatibleDC, с которого в свою очередь на форму, а с формы в файл (можно сразу с экрана в файл, короче, всё зависит от "фантазии"). Вот я накропал элементарный пример, поясняющий суть:

Код: Выделить всё
Dim mDC As Long, sDC As Long, i As Long, lDo As Boolean, lObj As Long
Dim lBFP As String

Private Sub Form_Click()
Do
  DoEvents
  If lDo Then
   mDC = GetDC(0)
   sDC = CreateCompatibleDC(mDC)
   lBFP = "c:\SSH" & Format(Now, "YYYY.MM.DD.hh.mm.ss") & ".bmp"
   SavePicture Me.Image, lBFP
   lObj = SelectObject(sDC, LoadPicture(lBFP))
   DeleteObject lObj
   BitBlt sDC, 1, 1, 1600, 1200, mDC, 1, 1, cvAPIBBcSrcCopy
   BitBlt Me.hDC, 1, 1, 1600, 1200, sDC, 1, 1, cvAPIBBcSrcCopy
   Me.Refresh
   lBFP = "c:\SSH" & Format(Now, "YYYY.MM.DD.hh.mm.ss") & ".bmp"
   SavePicture Me.Image, lBFP
   Debug.Print lBFP
   lDo = False
  End If
Loop
End Sub

Private Sub Form_Load()
Me.AutoRedraw = True
End Sub

Private Sub Tim_Timer()
lDo = True
End Sub


Проверял как при полноэкранном режиме TV-тюнера, так и при DVD-поигрывателе... а что ещё может быть нужно...

P.S. ScaleMode установи в пиксели... для наглядности используй WindowState = Maximized, ну и белый фон... :) :) :)

Если бы все было так легко, вряд ли в Hypersnap специальный пункт меню делали.Ну а если cvAPIBBcSrcCopy = vbSrcCopy, и все работает ,то почему у меня в просмотре рисунков показывало клип Linkin Park :D ?
الفيجوال بيسك الرابح

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Re: Скриншот с фильмы

Сообщение Approximator » 11.07.2004 (Вс) 7:26

GM писал(а):Если бы все было так легко, вряд ли в Hypersnap специальный пункт меню делали.

Если бы, да кабы... это не аргумент. Пример работает.
GM писал(а):Ну а если cvAPIBBcSrcCopy = vbSrcCopy, и все работает ,то почему у меня в просмотре рисунков показывало клип Linkin Park :D ?

Разумеется константы надо юзать штатные. Просто не стал исправлять... у меня объявлен Enum, чтобы было проще пользоваться функцией... остальных так делать никто не заставляет.
И что, когда заменил на vbSrcCopy не сработала? Так не бывает. Значит не все рекомендации выполнил или что-то переделал. Таймер не положил :) или ещё что-нибудь.
Дело в том, что у экрана есть "страница", указатель на которую ВСЕГДА можно получить, через GetDC(0). Вне зависимости от того, что кажут на экране. Главное, чтобы запрос указателя не предшествовал смене разрешения. А дальше, имея DC страницы копируй всё, что хочешь. Такова теория, такова и практика.
Именно потому "не пойти" не может.
У меня всё работает.
Конечно, если приведённый мною пример не пойдёт и у остальных, я напишу более сервисный вариант, чтобы можно было выявить причину облома. Но так, по-моему, направление ясно и так.
С уважением, Approximator.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 11.07.2004 (Вс) 7:35

И что, когда заменил на vbSrcCopy не сработала? Так не бывает. Значит не все рекомендации выполнил или что-то переделал. Таймер не положил или ещё что-нибудь.
Дело в том, что у экрана есть "страница", указатель на которую ВСЕГДА можно получить, через GetDC(0). Вне зависимости от того, что кажут на экране. Главное, чтобы запрос указателя не предшествовал смене разрешения. А дальше, имея DC страницы копируй всё, что хочешь. Такова теория, такова и практика.
Именно потому "не пойти" не может.
У меня всё работает.

Так все скриншотится, но во первых вместо того место где должно быть изображение у меня либо пусто, либо проигрывается тот самый клип. А да попробуй проскриншотить игру ну скажем Age of Empires, ну и обычное видео.[/quote]
الفيجوال بيسك الرابح

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 11.07.2004 (Вс) 7:43

GM писал(а):
И что, когда заменил на vbSrcCopy не сработала? Так не бывает. Значит не все рекомендации выполнил или что-то переделал. Таймер не положил или ещё что-нибудь.
Дело в том, что у экрана есть "страница", указатель на которую ВСЕГДА можно получить, через GetDC(0). Вне зависимости от того, что кажут на экране. Главное, чтобы запрос указателя не предшествовал смене разрешения. А дальше, имея DC страницы копируй всё, что хочешь. Такова теория, такова и практика.
Именно потому "не пойти" не может.
У меня всё работает.

Так все скриншотится, но во первых вместо того место где должно быть изображение у меня либо пусто, либо проигрывается тот самый клип. А да попробуй проскриншотить игру ну скажем Age of Empires, ну и обычное видео.

Так, а голова зачем? Неужели только, "чтоб ей есть"? :) Это же легко поправляется выбором размера (разрешение-то меняется!) и места. Можешь вообще миновать форму. Выясняй разрешение экрана. Кидай в CompatibleDC, делай CompatibleBitmap и сохраняй сразу в него. Моя задача была показать направление. А остальное всякий может сам.
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 11.07.2004 (Вс) 7:57

GM писал(а):
И что, когда заменил на vbSrcCopy не сработала? Так не бывает. Значит не все рекомендации выполнил или что-то переделал. Таймер не положил или ещё что-нибудь.
Дело в том, что у экрана есть "страница", указатель на которую ВСЕГДА можно получить, через GetDC(0). Вне зависимости от того, что кажут на экране. Главное, чтобы запрос указателя не предшествовал смене разрешения. А дальше, имея DC страницы копируй всё, что хочешь. Такова теория, такова и практика.
Именно потому "не пойти" не может.
У меня всё работает.

Так все скриншотится, но во первых вместо того место где должно быть изображение у меня либо пусто, либо проигрывается тот самый клип. А да попробуй проскриншотить игру ну скажем Age of Empires, ну и обычное видео.

Кстати, а какой интервал на таймере установлен? Оптимум должен быть при dt>секунды. У меня был установлен 2000, то есть 2 секунды. Превосходно щёлкает, независимо от того, что "на экрене пказывают". :)
С уважением, Approximator.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 11.07.2004 (Вс) 8:46

Это же легко поправляется выбором размера (разрешение-то меняется!)
Да в Age of Empires разрешение меняется, но там и палитра меняется, т.е. изображение получается совсем иное.Approximator вот попробуй.[/quote]
الفيجوال بيسك الرابح

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 11.07.2004 (Вс) 10:14

О Age of Empires это чуть не то.
ИМХО для вывода изображения видеоплеер юзает DirectX Hardware ускорение т. е. напрямую пишет в видео память, минуя GDI :arrow: стандартными методами отловить изображения не удастся, но если юзать Software ускорение, то изображения должно сфотографироватся.Вроде так :roll:
الفيجوال بيسك الرابح

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Re: Скриншот с фильмы

Сообщение Vovik » 11.07.2004 (Вс) 12:21

MOV писал(а):... Принт-скрином как известно, получаются, черные снимки...
Есть же функции Alt+PrintScreen и Ctrl+PrintScreen... :roll: И всё скриниться.... сам себе скрины из фильмов делаю... :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.07.2004 (Вс) 12:24

А это потому, что у тебя аппаратное ускорение в настройках плеера выключено.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 12.07.2004 (Пн) 0:13

Так что все таки я был в чем то прав :roll:
الفيجوال بيسك الرابح

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 12.07.2004 (Пн) 1:44

GM писал(а):О Age of Empires это чуть не то.
ИМХО для вывода изображения видеоплеер юзает DirectX Hardware ускорение т. е. напрямую пишет в видео память, минуя GDI :arrow: стандартными методами отловить изображения не удастся, но если юзать Software ускорение, то изображения должно сфотографироватся.Вроде так :roll:

Не знаю, я не гамер. Однако, само по себе наличие/отсутствие аппаратного ускорения может повлиять только на возможность использования PrintScreen'ом. К описанному мною варианту это отношения не имеет. Какая разница, как он рассчитывает спрайты... с аппаратным ускорением или нет? Всё, что ты видишь всё равно в итоге попадает в DC экрана и никак иначе. То есть вопрос может быть только в том, как брать это DC, куда его выгружать (когда создавать CompatibleDC, CompatibleBitmap etc., когда и чем ИНИЦИАЛИЗИРОВАТЬ CompatibleDC... как ты думаешь, зачем после создания CompatibleDC я туда делаю SelectObject готового битмапа?! Для инициализации (передачи туда данных структуры BITMAPINFO). Для примера я выбрал наиболее лёгкий способ инициализации. А иницилизируй CompatibleDC неправильно и всё - нифига ты туда из экрана не скопируешь)...
Короче, значит нужно на более тонком уровне (тщательного отслеживания всех параметров) проделать ВСЁ ТОЖЕ САМОЕ. Не сработать не может.
С уважением, Approximator.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 12.07.2004 (Пн) 1:50

Хорошо скинь полный исходник сюдп, и я попробую, но мне кажется это бесполезно :?, я буду использовать Windows Media Player 9 и какой нибудь фильм или клип.(Win XP SP1) Результаты выложу сюда.
الفيجوال بيسك الرابح

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 12.07.2004 (Пн) 2:14

GM писал(а):Хорошо скинь полный исходник сюдп, и я попробую, но мне кажется это бесполезно :?, я буду использовать Windows Media Player 9 и какой нибудь фильм или клип.(Win XP SP1) Результаты выложу сюда.

Так я выложил ВЕСЬ пример. За исключением объявления API-функцимй... Себе ничего не сохранял. Тебе нужны API?
Держи:
Код: Выделить всё
Public Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Public Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Public Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Public Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Public Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Public Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long

Всё.
С уважением, Approximator.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 12.07.2004 (Пн) 2:35

Вот результат:Изображение :?: [/img]
الفيجوال بيسك الرابح

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 12.07.2004 (Пн) 3:03

:) Всё ясно. :) Значит в этом случае так называемый primary monitor (а именно он возвращается функцией GetDC(0)) ещё не содержит ту картинку, которую ты видишь. :) Это легко поправить найдя нужный DC, для этого нужно сначала найти все monitors с помощью функции:
Код: Выделить всё
Private Declare Function EnumDisplayMonitors Lib "user32.dll" (ByVal hdc As Long, ByRef lprcClip As RECT, ByRef lpfnEnum As MONITORENUMPROC, ByVal dwData As Long) As Long

Думаю, что теперь он от тебя не уйдёт :)
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 12.07.2004 (Пн) 6:44

Можно ещё воспользоваться функциями
Код: Выделить всё
Public Declare Function MonitorFromPoint Lib "user32.dll" (ByVal x As Long, ByVal y As Long, ByVal dwFlags As Long) As Long
Public Declare Function MonitorFromRect Lib "user32.dll" (ByRef lprc As RECT, ByVal dwFlags As Long) As Long
Public Declare Function MonitorFromWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal dwFlags As Long) As Long

Потом уже определять то DC, которое содержит необходимую инфу... проблемы быть не должно. Никаких физических ограничений для этого нет.
С уважением, Approximator.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 12.07.2004 (Пн) 14:45

В винампе 5 в опциях Video я отключил Allow hardware video overlay,
т. е. апаратное ускорение , и после этого твоя прога работала, включил не работает.
الفيجوال بيسك الرابح

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 13.07.2004 (Вт) 4:20

GM писал(а):В винампе 5 в опциях Video я отключил Allow hardware video overlay,
т. е. апаратное ускорение , и после этого твоя прога работала, включил не работает.

Блин, ну нельзя же быть таким невнимательным. Я же выше пояснил, что скорее всего у тебя в режиме аппаратного ускорения изображение формируется на виртуальном мониторе... его можно (если нужно) отловить с помощью приведённых мною выше функций... сейчас немного занят. Чуть погодя напишу тебе пример, показывающий, что никакой разницы нет. Просто, мне кажется я достаточно ясно выражаюсь. Остальное зависит на настоящий момент лишь от твоего желания это сделать или не сделать... А так, просто при отключении аппаратного ускорения у тебя исчез виртуальный монитор... но это же не означает, что при наличии виртуального монитора на него нельзя получить DC или с него нельзя сделать BitBlt... так просто не бывает...
С уважением, Approximator.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.07.2004 (Ср) 10:15

При оверлее не используется GDI-подсистема и ничего отловить (через API-функции) не получится. Нужно юзать DirectX или работать напрямую с железом видеокарты.
Lasciate ogni speranza, voi ch'entrate.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 26.07.2004 (Пн) 7:27

alibek писал(а):При оверлее не используется GDI-подсистема и ничего отловить (через API-функции) не получится. Нужно юзать DirectX или работать напрямую с железом видеокарты.

Да? А так бывает (чтобы "ничего нельзя было отловить через API")? Вся инфа всё равно где-то загружается в память, где-то предварительно интерпретится и, стало быть, уже на этом уровне ДОЛЖНА быть доступна "через API" (вот интересно, "через API" это что, какой-то особый (и видимо ущербный :)) способ??? :)). Кстати, мне казалось, что контекст девайс-ная память (DC) a priori находится по месту дислокации (за исключением случаев, когда специально создаётся "зеркало") девайса. Само по себе обращение через DC использует специальный интерфейс. Дойдут руки я попробую сделать то, что обозначил выше. Если не получится - признаю. Но пока "в теории" не правда то, что ты, большой человек, :) говоришь... Кстати, про работу с дебаг-функциями "через API" из среды VB ты тоже нечто похожее говорил... см. http://bbs.vbstreets.ru/viewtopic.php?t=8818&start=15

P.S. Чтобы точно себе представлять суть вопроса настоятельно рекомендую познакомиться с теми библиотеками и их функциями, которые юзают сами видео-проигрыватели
С уважением, Approximator.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.07.2004 (Вт) 9:37

Эх...
А так бывает (чтобы "ничего нельзя было отловить через API")?

Я говорил именно про GDI (API-функции из gdi32.dll). Оверлей не использует эти функции, естественно их нельзя отловить, и естественно эти функции не будут возвращать изображение (т.к. оно формировалось в обход GDI).
У тебя видимо видеокарта не поддерживает апаратный оверлей, потому ты и не сталкивался с этим. Для захвата изображения, выводимого через оверлей, надо работать либо напрямую в железом (видеокартой), либо с DirectX.

Кстати, никогда не интересовался, почему для всех современных видеоплейеров (и многих мультимедийных продуктов) необходим DirectX?
Lasciate ogni speranza, voi ch'entrate.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 28.07.2004 (Ср) 5:56

alibek писал(а):Эх...
А так бывает (чтобы "ничего нельзя было отловить через API")?

Я говорил именно про GDI (API-функции из gdi32.dll). Оверлей не использует эти функции, естественно их нельзя отловить, и естественно эти функции не будут возвращать изображение (т.к. оно формировалось в обход GDI).

Дык и я о них родимых. Дело в том, что GDI это интерфейс работы с памятью девайса вне зависимости от того, чем и как создавалось изображение. Как по-твоему где находится память (за исключением "зеркал"), к которой ты обращаешься через интерфейс DC? Праально, в девайсе. Разумеется, в девайсе память тоже разбита на страницы (читай виртуальные мониторы, а на кой фиг по-твоему они (виртуальные мониторы) вообще нужны?) под разные нужды. Потому "в теории" не может существовать такого места в девайсе, куда нельзя было бы добраться с помощью GDI'шных функций.
У тебя видимо видеокарта не поддерживает апаратный оверлей, потому ты и не сталкивался с этим.

:) С чего ты взял? И поддерживает, и сталкивался. Но я ещё раз говорю (блин, ты просто дизассемблируй сами GDI'ишные функции, увидишь с чем они работают), что GDI'шные функции обращаются непосредственно к памяти девайса. Просто они для этого используют интерфейс DC. Например, через GetDIBits ты можешь взять данные из ЛЮБОГО места памяти девайса, если в DC у тебя бует содержаться правильное описание того, что ты хочешь взять. Зачем же смешивать особенности интерфейса и возможности. Выше уже писал, что это всего лишь случай, когда что-то не получается сделать "в тупую".
Для захвата изображения, выводимого через оверлей, надо работать либо напрямую в железом (видеокартой), либо с DirectX.

Кстати, никогда не интересовался, почему для всех современных видеоплейеров (и многих мультимедийных продуктов) необходим DirectX?
:) Это ж драйвер, а какой-нить драйвер всегда необходим. Ты можешь попробовать отключить аппаратное ускорение и "о чудо" тебе всё равно понадобится DirectX. С чего бы это вдруг? А? Ведь теперь всё скриншотится даже обычным принтскрином? У меня и маус отказывается корректно работать без DirectX'а и что с того? Я, что не могу отловить все сообщения посылаемые маусу?
Ладно, я же предложил, не продолжать до времени этот спор. Выше я привёл способ обращения к виртуальному монитору. Коль никто кроме меня не хочет его попробовать, тогда подождите, как освобожусь проверю. Раскопаю всю инфу по DC и оверлею. Посмотрим, может проще формировать свой DC (если проводить грубую аналогию, то в итоге будет такая же байда, как и SAFEARRAY - просто структура (интерфейс) для доступа к памяти девайса), а может и потянет через виртуальный монитор.
Если нифига у меня не получится я сообщу. Мне ж нет никакой корысти врать. :) Договорились?

P.S. Если у кого есть глянуть описание структуры DC буду признателен. Тем более, что это ускорит решение.
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 28.07.2004 (Ср) 7:22

Кстати, (по не проверенной пока инфе) через DC GDI-функуии обращаются в том числе и к DirectX-интерфейсу... так, что "ищите и обрящите"
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 28.07.2004 (Ср) 7:27

Вот, нашёл! Все отличия и сходства видны невооружённым взглядом:

Изображение
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 28.07.2004 (Ср) 7:35

А вот что используется для вывода потокового видео:

DirectShow
Microsoft DirectShow (предыдущее название — Microsoft ActiveMovie) представляет собой архитектуру для реализации потокового воспроизведения на платформе Microsoft Windows с поддержкой мультимедийных потоков. Такие потоки могут содержать аудио- и видеоданные, представленные в различных форматах, включая MPEG, Apple QuickTime, AVI и WAV. Также реализована возможность сохранения информации на основе Video for Windows (VFW) или Windows Driver Model (WDM).

Компонент DirectShow интегрирован в Microsoft DirectX, что позволяет ему использовать различные сервисы — работу с аппаратными функциями аудио- и видеоустройств, тем самым обеспечивая оптимальную производительность. Для разработчиков Internet- и Intranet-приложений в состав DirectShow входит компонент Windows Media Player, позволяющий воспроизводить мультимедийные данные в различных форматах, а также обеспечивающий такие сервисы, как воспроизведение MPEG-фильмов и видео в формате DVD. Начиная с версии DirectX Media 6.0 компонент Windows Media Player заменяет ранее использовавшийся компонент ActiveMovie.
С уважением, Approximator.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

    TopList