MOV писал(а):Просто интересно как сделать скриншот с фильма при показе его в полоэкранном режиме? Принт-скрином как известно, получаются, черные снимки. Может у кого есть исходник на ASM-e ? (там я думаю, это можно замутить и ничто не сможет помешать ).
И в чем вообще суть? Почему так получатеся? Неужели типа защита стоит?
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
Approximator писал(а):MOV писал(а):Просто интересно как сделать скриншот с фильма при показе его в полоэкранном режиме? Принт-скрином как известно, получаются, черные снимки. Может у кого есть исходник на ASM-e ? (там я думаю, это можно замутить и ничто не сможет помешать ).
И в чем вообще суть? Почему так получатеся? Неужели типа защита стоит?
Так уж и на 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, ну и белый фон...
GM писал(а):Если бы все было так легко, вряд ли в Hypersnap специальный пункт меню делали.
GM писал(а):Ну а если cvAPIBBcSrcCopy = vbSrcCopy, и все работает ,то почему у меня в просмотре рисунков показывало клип Linkin Park ?
И что, когда заменил на vbSrcCopy не сработала? Так не бывает. Значит не все рекомендации выполнил или что-то переделал. Таймер не положил или ещё что-нибудь.
Дело в том, что у экрана есть "страница", указатель на которую ВСЕГДА можно получить, через GetDC(0). Вне зависимости от того, что кажут на экране. Главное, чтобы запрос указателя не предшествовал смене разрешения. А дальше, имея DC страницы копируй всё, что хочешь. Такова теория, такова и практика.
Именно потому "не пойти" не может.
У меня всё работает.
GM писал(а):И что, когда заменил на vbSrcCopy не сработала? Так не бывает. Значит не все рекомендации выполнил или что-то переделал. Таймер не положил или ещё что-нибудь.
Дело в том, что у экрана есть "страница", указатель на которую ВСЕГДА можно получить, через GetDC(0). Вне зависимости от того, что кажут на экране. Главное, чтобы запрос указателя не предшествовал смене разрешения. А дальше, имея DC страницы копируй всё, что хочешь. Такова теория, такова и практика.
Именно потому "не пойти" не может.
У меня всё работает.
Так все скриншотится, но во первых вместо того место где должно быть изображение у меня либо пусто, либо проигрывается тот самый клип. А да попробуй проскриншотить игру ну скажем Age of Empires, ну и обычное видео.
GM писал(а):И что, когда заменил на vbSrcCopy не сработала? Так не бывает. Значит не все рекомендации выполнил или что-то переделал. Таймер не положил или ещё что-нибудь.
Дело в том, что у экрана есть "страница", указатель на которую ВСЕГДА можно получить, через GetDC(0). Вне зависимости от того, что кажут на экране. Главное, чтобы запрос указателя не предшествовал смене разрешения. А дальше, имея DC страницы копируй всё, что хочешь. Такова теория, такова и практика.
Именно потому "не пойти" не может.
У меня всё работает.
Так все скриншотится, но во первых вместо того место где должно быть изображение у меня либо пусто, либо проигрывается тот самый клип. А да попробуй проскриншотить игру ну скажем Age of Empires, ну и обычное видео.
Да в Age of Empires разрешение меняется, но там и палитра меняется, т.е. изображение получается совсем иное.Approximator вот попробуй.[/quote]Это же легко поправляется выбором размера (разрешение-то меняется!)
Есть же функции Alt+PrintScreen и Ctrl+PrintScreen... И всё скриниться.... сам себе скрины из фильмов делаю...MOV писал(а):... Принт-скрином как известно, получаются, черные снимки...
GM писал(а):О Age of Empires это чуть не то.
ИМХО для вывода изображения видеоплеер юзает DirectX Hardware ускорение т. е. напрямую пишет в видео память, минуя GDI стандартными методами отловить изображения не удастся, но если юзать Software ускорение, то изображения должно сфотографироватся.Вроде так
GM писал(а):Хорошо скинь полный исходник сюдп, и я попробую, но мне кажется это бесполезно , я буду использовать Windows Media Player 9 и какой нибудь фильм или клип.(Win XP SP1) Результаты выложу сюда.
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
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
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
GM писал(а):В винампе 5 в опциях Video я отключил Allow hardware video overlay,
т. е. апаратное ускорение , и после этого твоя прога работала, включил не работает.
alibek писал(а):При оверлее не используется GDI-подсистема и ничего отловить (через API-функции) не получится. Нужно юзать DirectX или работать напрямую с железом видеокарты.
А так бывает (чтобы "ничего нельзя было отловить через API")?
alibek писал(а):Эх...А так бывает (чтобы "ничего нельзя было отловить через API")?
Я говорил именно про GDI (API-функции из gdi32.dll). Оверлей не использует эти функции, естественно их нельзя отловить, и естественно эти функции не будут возвращать изображение (т.к. оно формировалось в обход GDI).
У тебя видимо видеокарта не поддерживает апаратный оверлей, потому ты и не сталкивался с этим.
Для захвата изображения, выводимого через оверлей, надо работать либо напрямую в железом (видеокартой), либо с DirectX.
:) Это ж драйвер, а какой-нить драйвер всегда необходим. Ты можешь попробовать отключить аппаратное ускорение и "о чудо" тебе всё равно понадобится DirectX. С чего бы это вдруг? А? Ведь теперь всё скриншотится даже обычным принтскрином? У меня и маус отказывается корректно работать без DirectX'а и что с того? Я, что не могу отловить все сообщения посылаемые маусу?Кстати, никогда не интересовался, почему для всех современных видеоплейеров (и многих мультимедийных продуктов) необходим DirectX?
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.
Сейчас этот форум просматривают: Google-бот и гости: 83