узнать смотрит ли юзер видео
вообще нужно узнать сабж, и если смотрит, то прога продолжает висеть в трее и не высовывается. но для уточнения и упрощения начинаю с гораздо меньшего - как узнать запущен ли winamp, wmp или wmc? пока что буду пробовать через FindWindow, думаю получится. но вы ведь понимаете, что это весьма далеко от того что задумано. нужно хотя бы узнать крутит ли тот же WMP видео или стоит на паузе, например. как это сделать? помогите чем сможете, оч прошу.
Во-вторых, блин, ну тут навскидку - предлагаю хитрый вариант (может и не совсем правильный), определять загруженность процессора именно по этим процессам. Если загрузка больше определенного, то тогда юзер определенно что-то смотрит, или слушает. Но имхо, не самый точный и не самый правильный вариант. Я пока не в состоянии предложить что-нибудь по-умнее, поскольку я не совсем трезв))))
Один из наиболее действенных способов состоит в следующем: перечисляем все запущенные в данный момент процессы, если среди них встретился winamp.exe, wmplayer.exe и т.д., то внедряем в каждый из этих процессов свою dll. Эта dll перехватывает вызов NtReadFile/ZwReadFile,в функции-перехвате получает хэндл файла, из которого считываются данные, затем по хэндлу определяет имя файла. Если у файла расширение avi, mpeg, flv и т.д., то значит пользователь смотрит видео. Естественно, данный способ не дает стопроцентной гарантии. Однако способ с загрузкой процессора дает гарантию гораздо скромнее, чем описанный выше.
(например
http://www.windowsfaq.ru/content/view/371/37/
)
и с помощью той же toolhelp32 определить загружен ли какой-либо
из них в адресное пространство какого-либо процесса.
Загружен кодек- процесс воспроизводит / конвертирует / записывает
видео. Или звук.
а плееров понаписано - завались.
может я ирфаном фильмы люблю проигрывать.
а насчёт процессов сделал вот так:
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;
}
спасибо.
а вызов NtReadFile/ZwReadFile происходит только при начале считывания?
[/QUOTE]
лучше не парься с этим, перехватывать АПИ-вызова сложнее
чем баш читать:)
[QUOTE='AIL ]:->;266864']
если нет, то вручную вырубят, ничо страшного)
но если замутить свою систему шароварности.. а то я разбирался как это делается - оказалось, что через сторонние проги, через счета в банках..
[/QUOTE]
немного непонятно, что ты замутить-то пытаешься?
прогу чтоли шароварную?
тогда не туда свернул.
[quote='AIL ]:->;266864']чото всё так сложно.. лучше баш почитаю..[/quote]Да будет вам известно, что System.Diagnostics.Process работает посредством ToolHelp32. Получив список кодеков можно делать выводы о том, что процесс проигрывает видео или нет, сопоставляя его со списком загруженных модулей (dll или exe) этого процесса.
так что я сразу начал с длл-лями возиться. сейчас потихонечку разбираюсь с 22ой главой книги джеффри рихтера - внедрить длл в чужой процесс через "ловушки" и направлять уведомления своему приложению. в таком случае и то какой именно плеер используется становится неважно. надеюсь всё правильно понял и всё получится.
но баш я всёравно читаю параллельно и нефиг стебать)))
пс: кстате ещё меня смутило то что в списке кодеков выдаётся много .acm'ов, кажется, а в адресном простанстве только dll'и. поискал глазами те немногие длл которые выдал список кодеков (через скрипт .vbs по ссылке) в адресном пространстве и не нашёл. мог не заметить, впрочем, но решил, таки, не возиться с этим вариантом - он ведь ещё и не выгружает кодек из пространства при паузе скорее всего.
по -моему, путаешь понятия.
Под адресным пространством я имел ввиду память процесса,
который исследуется toolhelp-ом.
Чтобы облегчить тебе задачу, я бы посоветовал не заморачиваться с ловушками, а внедрять длл-ку через реестр(У рихтера написано как) во все без исключения процессы(чтобы не было привязки к конкрентым плеерам). Рекомендую: перед перезагрузкой этот ключ ставить в первоначальное положение, т.е. чтоб он был пустым. Иначе можно попасть немного. Я вот доигрался до того, что при загрузке даже в safe-mode винда падала в бсод. Исправилось легко, но все же неприятно было. Как дойдет до перехвата readfile() пиши, помогу исходником.
дело в том что некоторые библиотеки содержат и аудио и видео фильтры.
quartz.dll, например.
так что автору остается перехватывать API вызова.
или копать глубже в DirectShow.
я выбираю сектор-приз! бгггг :D))
в общем, долго разбирался с встраиванием длл и перехватыванием апи-вызовов через разделы импорта - ничего не вышло, даже винду переставил - она грязной была - так и вылетает прога при встраивании длл без всяких ошибок. аналогичные примеры и народные исправления примеров рихрета также не помолги.
в частности отписался в теме
http://www.wasm.ru/forum/viewtopic.php?id=18239
пример выложенный там именно вот так вот и вылетает без ошибок.
совершенно не понимаю в чём дело.
буду пробовать через реестр.
спасибо за помощь, ребята)
ps кстате, список открытых файлов из статьи на wasm.ru - оч крутая вещь, но в ней тоже для меня недочёт - при паузе файл всё равно остаётся открытым. оч надеюсь, что при перехватывании апи-вызовов с этим не будет проблем. =\