Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

узнать смотрит ли юзер видео

43K
19 ноября 2008 года
AIL ]:->
4 / / 19.11.2008
вообще нужно узнать сабж, и если смотрит, то прога продолжает висеть в трее и не высовывается. но для уточнения и упрощения начинаю с гораздо меньшего - как узнать запущен ли winamp, wmp или wmc? пока что буду пробовать через FindWindow, думаю получится. но вы ведь понимаете, что это весьма далеко от того что задумано. нужно хотя бы узнать крутит ли тот же WMP видео или стоит на паузе, например. как это сделать? помогите чем сможете, оч прошу.
7.2K
19 ноября 2008 года
polaroid
94 / / 05.07.2008
Во-первых через FindWindow стремновато как-то искать запущенные программы. ИМХО проще это делать с помощью ToolHelp32. Создаешь снэпшот и ищешь в нем запущенные процессы по названию (winamp, wmplayer - или как он там зовется).
Во-вторых, блин, ну тут навскидку - предлагаю хитрый вариант (может и не совсем правильный), определять загруженность процессора именно по этим процессам. Если загрузка больше определенного, то тогда юзер определенно что-то смотрит, или слушает. Но имхо, не самый точный и не самый правильный вариант. Я пока не в состоянии предложить что-нибудь по-умнее, поскольку я не совсем трезв))))
43K
20 ноября 2008 года
John_smith
4 / / 14.11.2008
Один из наиболее действенных способов состоит в следующем: перечисляем все запущенные в данный момент процессы, если среди них встретился winamp.exe, wmplayer.exe и т.д., то внедряем в каждый из этих процессов свою dll. Эта dll перехватывает вызов NtReadFile/ZwReadFile,в функции-перехвате получает хэндл файла, из которого считываются данные, затем по хэндлу определяет имя файла. Если у файла расширение avi, mpeg, flv и т.д., то значит пользователь смотрит видео. Естественно, данный способ не дает стопроцентной гарантии. Однако способ с загрузкой процессора дает гарантию гораздо скромнее, чем описанный выше.
38K
20 ноября 2008 года
Tooth
38 / / 07.10.2008
логичнее было бы получить список установленных кодеков
(например
http://www.windowsfaq.ru/content/view/371/37/
)
и с помощью той же toolhelp32 определить загружен ли какой-либо
из них в адресное пространство какого-либо процесса.
Загружен кодек- процесс воспроизводит / конвертирует / записывает
видео. Или звук.

а плееров понаписано - завались.
может я ирфаном фильмы люблю проигрывать.
43K
22 ноября 2008 года
AIL ]:->
4 / / 19.11.2008
чото всё так сложно.. лучше баш почитаю..
а насчёт процессов сделал вот так:
using System.Diagnostics;
Process[] processes = Process.GetProcessesByName("wmplayer");
if(processes.Length!=0) ..

вот ещё вопросы:
а вызов NtReadFile/ZwReadFile происходит только при начале считывания? или например ролик весь в оперативу грузится и больше таких вызовов не происходит?

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

и ещё не поможете перевести на C#? вроде довёл до кое-чего, но до конца так и не смог. теперь видимо понадовится для "с помощью той же toolhelp32 определить загружен ли какой-либо
из них в адресное пространство какого-либо процесса"
HANDLE h;
PROCESSENTRY32 pe;
bool video=false;
h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL );
pe.dwSize=sizeof(PROCESSENTRY32);
Process32First(h,&pe);
while(1){
if (pe.szExeFile == "wmplayer.exe") { video = true; break; }
if (!Process32Next(h,&pe)) break;
}

вот что накатал:
struct PROCESSENTRY32my
{
public int dwSize, cntUsage, th32ProcessID, th32ModuleID, cntThreads, th32ParentProcessID, dwFlags;
public ulong th32DefaultHeapID;
public long pcPriClassBase;
public string szExeFile;
}
[DllImport("Kernel32.dll")]
private static extern IEnumerator CreateToolhelp32Snapshot(int dwFlags, int th32ProcessID);
[DllImport("Kernel32.dll")]
private static extern bool Process32First(IEnumerator hSnapshot, PROCESSENTRY32my lppe);
[DllImport("Kernel32.dll")]
private static extern bool Process32Next(IEnumerator hSnapshot, PROCESSENTRY32my lppe);
IEnumerator h;
PROCESSENTRY32my pe;
bool video=false;
h = CreateToolhelp32Snapshot(0x00000002, 0);
pe.dwSize = System.Runtime.InteropServices.Marshal.SizeOf(pe);
Process32First(h,pe);
while(true){
if (pe.szExeFile == "wmplayer.exe") { video = true; break; }
if (!Process32Next(h, pe)) break;
}

спасибо.
38K
23 ноября 2008 года
Tooth
38 / / 07.10.2008
[QUOTE='AIL ]:->;266864']
а вызов NtReadFile/ZwReadFile происходит только при начале считывания?
[/QUOTE]
лучше не парься с этим, перехватывать АПИ-вызова сложнее
чем баш читать:)
[QUOTE='AIL ]:->;266864']
если нет, то вручную вырубят, ничо страшного)
но если замутить свою систему шароварности.. а то я разбирался как это делается - оказалось, что через сторонние проги, через счета в банках..
[/QUOTE]
немного непонятно, что ты замутить-то пытаешься?
прогу чтоли шароварную?
тогда не туда свернул.
5
23 ноября 2008 года
hardcase
4.5K / / 09.08.2005
[quote='AIL ]:->;266864']чото всё так сложно.. лучше баш почитаю..[/quote]Да будет вам известно, что System.Diagnostics.Process работает посредством ToolHelp32. Получив список кодеков можно делать выводы о том, что процесс проигрывает видео или нет, сопоставляя его со списком загруженных модулей (dll или exe) этого процесса.
43K
25 ноября 2008 года
AIL ]:->
4 / / 19.11.2008
через список кодеков мимо - попробовал. во всяком случае со звуком в дальнейшем этот вариант мне никаких перспектив не даёт - тыкаю по винампу плэй, а в адресном пространстве никаких изменений. а мне та же байда со звуком может потребоваться, и тогда придётся ещё и другой вариант делать.
так что я сразу начал с длл-лями возиться. сейчас потихонечку разбираюсь с 22ой главой книги джеффри рихтера - внедрить длл в чужой процесс через "ловушки" и направлять уведомления своему приложению. в таком случае и то какой именно плеер используется становится неважно. надеюсь всё правильно понял и всё получится.

но баш я всёравно читаю параллельно и нефиг стебать)))

пс: кстате ещё меня смутило то что в списке кодеков выдаётся много .acm'ов, кажется, а в адресном простанстве только dll'и. поискал глазами те немногие длл которые выдал список кодеков (через скрипт .vbs по ссылке) в адресном пространстве и не нашёл. мог не заметить, впрочем, но решил, таки, не возиться с этим вариантом - он ведь ещё и не выгружает кодек из пространства при паузе скорее всего.
38K
26 ноября 2008 года
Tooth
38 / / 07.10.2008
[QUOTE='AIL ]:->;267263']в адресном пространстве и не нашёл. [/QUOTE]
по -моему, путаешь понятия.
Под адресным пространством я имел ввиду память процесса,
который исследуется toolhelp-ом.
43K
27 ноября 2008 года
John_smith
4 / / 14.11.2008
Чтобы облегчить тебе задачу, я бы посоветовал не заморачиваться с ловушками, а внедрять длл-ку через реестр(У рихтера написано как) во все без исключения процессы(чтобы не было привязки к конкрентым плеерам). Рекомендую: перед перезагрузкой этот ключ ставить в первоначальное положение, т.е. чтоб он был пустым. Иначе можно попасть немного. Я вот доигрался до того, что при загрузке даже в safe-mode винда падала в бсод. Исправилось легко, но все же неприятно было. Как дойдет до перехвата readfile() пиши, помогу исходником.
38K
29 ноября 2008 года
Tooth
38 / / 07.10.2008
к сожалению, мое предложение о просмотре процессов на предмет загрузки кодеков не прокатывает-невозможно однозначно определить проигрывается только аудио или аудио/видео.
дело в том что некоторые библиотеки содержат и аудио и видео фильтры.
quartz.dll, например.
так что автору остается перехватывать API вызова.
или копать глубже в DirectShow.
43K
29 ноября 2008 года
AIL ]:->
4 / / 19.11.2008
дада(
я выбираю сектор-приз! бгггг :D))

в общем, долго разбирался с встраиванием длл и перехватыванием апи-вызовов через разделы импорта - ничего не вышло, даже винду переставил - она грязной была - так и вылетает прога при встраивании длл без всяких ошибок. аналогичные примеры и народные исправления примеров рихрета также не помолги.
в частности отписался в теме
http://www.wasm.ru/forum/viewtopic.php?id=18239
пример выложенный там именно вот так вот и вылетает без ошибок.
совершенно не понимаю в чём дело.
буду пробовать через реестр.
спасибо за помощь, ребята)

ps кстате, список открытых файлов из статьи на wasm.ru - оч крутая вещь, но в ней тоже для меня недочёт - при паузе файл всё равно остаётся открытым. оч надеюсь, что при перехватывании апи-вызовов с этим не будет проблем. =\
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог