Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > узнать смотрит ли юзер видео или слушает аудио |
Автор: fakefreak 18.6.2009, 17:53 |
нужно узнать смотрит ли юзер видео или слушает ли аудио. причём именно работает ли, т.е. не стоит ли плеер на паузе. плееры WMP, WMC, winamp, etc.. - думаю, что это не влияет на дело, потому что делать хочу внедрением dll во все процессы через реестр и перехватом вызовов zwreadfile/ntreadfile - если процесс, обратившийся к звуковому или видео файлу имеет название winamp, например, то значит видео воспроизводится. дельная идея или посоветуете получше? мне кажется, что гнилая идея, потому что низкоуровневое обращение плеера к файлу может производиться и при паузе. но ничего более дельного придумать не могу. |
Автор: andrew_121 18.6.2009, 21:51 |
fakefreak, Не верный подход. Невозможно определить то, что юзер смотрит фильм или слушает музыку. Это многозадачная ОС !!! Проще отслеживать процессы по названию. Их не так уж много. |
Автор: fakefreak 18.6.2009, 23:33 |
список процессов я уже получил успешно, увидел к примеру там винамп, получил у этого процесса список кодеков, чтобы понять чем занят плеер.. но всё это тупиковая ветвь. по кодекам загруженным в процесс ничего точного не скажешь, а просто список запущенных процессов мне тем более никак помочь не может - например агент винампа зачастую загружается при старте системы и висит в трее, но это ничего ещё не значит. паузу плеера при таком подходе тем более никак не понять. а разве "многозадачная ОС !!!" - это аргумент для "Невозможно определить то, что юзер смотрит фильм или слушает музыку"? мне кажется, что способ должен быть, и не один, проблема только в сложности исполнения и точности предсказания. |
Автор: andrew_121 18.6.2009, 23:36 | ||
![]() |
Автор: bugmenot 19.6.2009, 04:37 |
Может лучше перехватывать функции для вывода звука? (хотя это не поможет с видео без звука) |
Автор: jonie 19.6.2009, 07:25 |
WMP имеет API, равно как и винамп.. можно использовать его. |
Автор: Andrey44 19.6.2009, 07:33 |
Еще конечно как вариант можно через загрузку процессора этим процессом. Тупо конечно, но можно. Когда что-то воспроизводится процессор грузится больше, когда на паузе - загрузки почти нет. Это просто как вариант. ![]() |
Автор: andrew_121 20.6.2009, 19:44 | ||
Так же как и у винампа, только апи другие. |
Автор: fakefreak 21.6.2009, 00:54 |
порылся, скачал сдк к винампу.. в общем я правильно понимаю, что использовать апи винампа это значит написать свою длл, которая бы общалась с винампом через это самое апи? и это называется плагин. если так, то всё понятно и вариант отпадает. если же всё-таки возможно написать своё приложение, общающееся каким-то образом (каким?) с винампом через апи, то возможно сканало бы. но как тогда происходит это общение? - это мне как раз и непонятно было, когда спрашивал: |
Автор: nix_crash 21.6.2009, 05:38 | ||
Угу. Нет. Смотри СДК. Ищи категорию функций не связанных с плагинами. Что-то вроди СОМ-сервера(или...). Для точности, спроси у виндавз-юзерс. Это в их юрисдикции. |
Автор: fakefreak 22.6.2009, 15:34 |
так.. всё-таки хотелось бы перехватывать вызовы к подсистемам винды. и вариант с перехватом вызовов звуковых функций мне нравится больше, чем функций чтения файлов. надежнее выглядит. но если перехватывать у приложения вызовы к winapi, а оно обращается напрямую к native api, или ещё жёсче - к ядру, то перехват ничего не даст. в связи с этим вопрос, может быть кто знает: винамп использует winapi для работы со звуком или например native api? то есть на каком уровне он работает со звуком? не удивлюсь, что там низкоуровневое обращение к звуку.. ну и может кто знает то же самое для Windows Media Player |
Автор: xvr 22.6.2009, 17:24 |
90% мультимедийных приложений используют DirectX (точнее DirectShow & DirectSound) для вывода звука. Не уверен, что есть какие либо стандартные методы перехвата таких обращений. Кроме того, звук могут выводить не только плеера, даже голый MessageBox выводит какой то звук при открытии ![]() |
Автор: fakefreak 23.6.2009, 00:23 | ||||
ну это не проблема, если встраивать перехватчик, потому что пускай он будет проверять название процесса, в адресном пространстве которого находится, а вот
прекрасное замечание, я дурак раньше не сообразил. но в целом всё равно с помощью точно такого же перехвата хочу делать. только вот теперь вопрос: как мне узнать загруженные процессом длл, и главное - как узнать вызываемые процессом функции из этой длл? например из dshow.dll, чтоб выбрать ту которую собственно перехватывать буду. |
Автор: xvr 23.6.2009, 08:55 | ||||||||
DX & DShow работают через COM. Так что перехватывать надо вызовы CoCreateObject с соответствующими UUID А названия DLL могут меняться
|
Автор: fakefreak 25.6.2009, 03:24 | ||||
cпасибо. к винампу подгружен dsound.dll и ещё какой-то in_dshow.dll, на который я решил не обращать внимания. в итоге подробно ознакомился с DirectSound
и подробно поразбирался с COM, но возник такой вопрос: я могу перехватывать только CoCreateObject, направленный системе? то есть после этого создаётся в адресном пространстве процесса объект класса (устройства DirectSound), с которым я уже ничего перехватывать не смогу, так? потому что мне перехват функции CoCreateObject не нужен - он очевидно вызывается при запуске винампа. но вот например перехват метода Play у объекта класса IDirectSound мне бы и нужен был - это вообще реально его перехватить? |
Автор: xvr 25.6.2009, 12:25 | ||||||||
Да
|
Автор: fakefreak 25.6.2009, 17:42 |
Спасибо, xvr. Вроде теперь всё понятно и очень интересно. Думаю вопросы ещё появятся, буду задавать. =) |
Автор: fakefreak 26.6.2009, 01:12 |
так.. :( ничего не понимаю с функцией CoCreateObject - может немного не то написали? есть подходящие по смыслу CoCreateInstance и CoGetClassObject, но про CoCreateObject инфы практически нету. вот нашёл, что "The CoCreateObject function only applies to InstallScript projects.", но причём здесь InstallScript и InstallShield ума не приложу о_О |
Автор: Andrew121 26.6.2009, 04:54 |
fakefreak, Что значит нет?!!! Вот: http://social.msdn.microsoft.com/Search/en-US/?query=CoCreateObject&ac=8 Просвещайся ![]() |
Автор: fakefreak 26.6.2009, 14:44 | ||||
да, на мсдн'е я есессно искал уже, но после этого ещё детально с каждой ссылкой ознакомился. в паре случаев что-то совершенно несущественное, пара ссылок пустых, а в остальных только лишь:
к примеру по CoCreateInstance есть полное описание функции, как и всех системных, но к этой почему-то нет совершенно никакой инфы - первый раз с таким сталкиваюсь. ладно, я наверное вам уже надоел своими глупыми вопросами.. даже как-то смущаюсь.. =) |
Автор: xvr 27.6.2009, 21:57 | ||||
Не то, оно называется CoCreateInstance
Возможно есть еще функции, которыми можно создавать COM объекты |
Автор: fakefreak 28.6.2009, 00:23 | ||||
из функций
вызываются только
в общем довольно странно пока что для меня. непонятно, буду разбираться.. |
Автор: xvr 28.6.2009, 17:44 | ||||
Вполне нормальный набор. Надо контролировать, что передается в первых 2х параметрах CoCreateInstance Но есть подводный камень - в том же WinAmp'е вывод (равно как и все остальное) делается через PlugIn'ы, и для вывода есть 3 штуки: DS, Wave, Disk. Так что DS может быть и не задействован вообще. Мне представляется, что нужно контролировать первоисточник, т.е. звуковую карту. Проверить настройки звукового mixer'а, включить capture звука (предварительно настроив mixer), и проанализировать звук - если там есть что то, большее уровня шумов в течении как минимум нескольких секунд, значит в колонках что то звучит ![]() |
Автор: fakefreak 29.6.2009, 23:45 | ||
а с помощью чего это делать? то есть подскажите куда копать нужно, кто такие функции предоставляет. апи виндовс? win32 или native? или directx? в принципе идея хороша, но что будет, если пользователь в трее на значке динамика в винде выключит звук? - на звуковой карте будут одни шумы? ps а у меня уже перехват cocreateinstance заработал - теперь вроде как и не нужен =\ |
Автор: xvr 30.6.2009, 09:34 | ||||
В API есть набор функций waveIn* и mixer* (в mmsystem.h) Через DirectSound тоже можно (см в прикрепленном файле пример ввода через waveIn - ввод используется для оцифровки шумов карты, для получения случайных значений для генератора случайных чисел)
![]() |
Автор: fakefreak 2.7.2009, 19:36 | ||||
спасибо большое. разобрался, начитался.. но есть одно но: в примере сигнал считывается с микрофона, но вся система mmsystem.h предоставляет только функции записи с устройств линейного входа, микрофона, ещё каких-то неважных.. и функции воспроизведения на устройства линейного выхода, миди, и т.д.. запись мне не нужна, а надо бы узнать что происходит на линейном выходе. но туда можно только воспроизводить буферы, а узнать что на нём происходит нельзя. разве что если на линейный вход может прямиком поступать сигнал с линейного выхода. но в этом я сомневаюсь нехило.
вы это и имели ввиду? а с DirectSound ещё не разбирался |
Автор: xvr 2.7.2009, 21:42 |
Прочтите через mixer к чему подключен выход и подключите туда же канал записи |
Автор: fakefreak 19.7.2009, 12:19 | ||
извините, но не смог ничего сделать
как это сделать? нашёл уйму приложений с исходниками, которые записывают. но все они записывают с микрофона - ни одно не записывает с выхода звуки. как записать средствами winmm.dll звуки, издаваемые компьютером? помогите пожалуйста чем-нибудь |
Автор: xvr 20.7.2009, 09:48 |
Прочесть (перебрать) текущие настройки канала вывода, попробовать найти аналоги в канале ввода и настроить его аналогично |