Отслеживание запусков других приложений
Удачи :)
Это вообще к чему?(каждую секунду просматривать список процессов и окон вообще черезжопный метод)
Поставить хук на сообщения окон и обрабатывать сообщения создания и уничтожения, потом у каждого окна получать процесс родитель, вот и всё.
Нет, к сожалению, таких хуков (но может и ошибаюсь я).
[QUOTE=ahilles]Поставить хук на сообщения окон и обрабатывать сообщения создания и уничтожения, потом у каждого окна получать процесс родитель, вот и всё.[/QUOTE]
А если приложение создает несколько окон? А если вообще нет окон у приложения? Тоже не очень хорошо получается :)
Тут нужно или на уровне ядра или так
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1279&mode=print
в реестре есть ключ:
там смотрим AppInit_DLLs. сюда можно записать dll'шку которая будет подгружаться к процессам при их запуске. соответственно все, что будет нужно для слежения за процессами это написать длл и в ней код для DLL_PROCESS_ATTACH и для DLL_PROCESS_DETACH. как сообщить следящему приложению о запуске или окончании работы процесса это уже другой вопрос, но тоже решаемый.
это почему? если длл ничего такого не делает, что можно принять за действия вируса или еще какой мрази, то антивирь либо ничего не покажет либо спросит "разрешить действие или нет?", если пользователь ознакомлен с работой программы и полностью ей доверяет, то разрешит и все на этом закончиться.
по-крайней мере этот способ реализовать проще чем перехват, и, на мой взгляд, он получше проверки списка процессов и поиска окон.
P.S. если бы мне надо было реализовать подобную задачу, то я бы делал именно через длл.
Поэтому нужно учитывать для какой ОСи будет разрабатывается приложение.
А может автор пишет прогу для узкого круга фанатов Мастдайки :)
[QUOTE=ahilles]ну я надёеюсь что на висте есть такой ключ[/QUOTE]
Если верить этому
http://groups.google.de/group/microsoft.public.win32.programmer.kernel/browse_frm/thread/fbdefc5170b44a3e
то Виста не поддерживает данный ключ. Да и на сайте Милкософта нет этой ОСи в списке поддерживаемых
http://support.microsoft.com/kb/197571
Скорей всего это сделано с соображений безопасности.
Сходи еще по вот этой ссылке: http://support.microsoft.com/kb/134655/ :).
То же можно реализовать под NT.... Хотя думаю, это уже будет универсальный способ :)
в реестре есть ключ:
там смотрим AppInit_DLLs. сюда можно записать dll'шку которая будет подгружаться к процессам при их запуске. соответственно все, что будет нужно для слежения за процессами это написать длл и в ней код для DLL_PROCESS_ATTACH и для DLL_PROCESS_DETACH.
Установка глобального хука путём вызова SetWindowsHookEx всегда влечёт за собой подгрузку библиотеки с функцией перехвата события в каждое из уже запущенных или вновь запускаемых приложений, поэтому есть ли в системном реестре конкретной версии Windows указанный выше ключ или нет - не имеет никакого значения.
Именно на это я и писал линк. См пост выше
[quote=ahilles]но ведь нужно как то передать управление точке входа библиотеки, ну если только написать отдельно программу в которой всего лишь одна строчка loadlibrary('........'); и засунуть её в обычный автозапуск[/quote]
она вызывается всегда при загрузке и выгрузке библиотеки!
А что - разве задача стоит именно так - загружать библиотеку без помощи другой программы?
Почему? Кажется, автор темы ничего такого не говорил.
метод реализации таков:
надо поставить api hook в овсех процессах на функции запуска процессов и функции завершения процессов (если хорошенько подумать то их не так много), для того чтобы поставить API hook внедриться в процесс, самый простой метод внедрения дллки во все процессы это через SetwindowsHookEx , но можно внедрять свою дллку во вновь создаваемые процессы так как мы перехватываем функции создания (при первой загрузке придётся пролистать список процессов внедриться в каждый)
в обоих методах есть только одна проблема это хоть один раз загрузить свою длл в любой процесс, для этого мы используем ключ AppInit_DLLs
ВОТ НЕБОЛЬШОЙ КОНСПЕКТ ВСЕЙ ВЕТКИ.
кстати вот процедурка на delphi которая грузит длл в чужой процесс (для второго метода, когда не использунется Setwindowshookex)
var
pLL,pDLLPath:Pointer;
hProcess,hThr:THandle;
LibPathLen,_WR,ThrID:DWORD;
begin
Result:=False;
LibPathLen:=Length(string(LibName));
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
if hProcess=0 then exit;
pDLLPath:=VirtualAllocEx(hProcess,0,LibPathLen+1,MEM_COMMIT,PAGE_READWRITE);
if DWORD(pDLLPath)=0 then exit;
pLL:=GetProcAddress(GetModuleHandle(kernel32),'LoadLibraryA');
WriteProcessMemory(hProcess,pDLLPath,LibName,LibPathLen+1,_WR);
hThr:=CreateRemoteThread(hProcess,0,0,pLL,pDLLPath,0,ThrID);
if hThr=0 then exit;
Result:=CloseHandle(hProcess);
end;