![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Global HOOK без DLL.. Это как? Или вообще ни хук?
Dima_dvp © (2003-10-23 03:38:00)
Вот я тут наткнулся на задачу отловить создание окон(всех окон верхнего уровня всех процессов). Так вот конечно же первым делом в SDK - а там говорят надо DLL. Ну сделал для теста сначала HOOK для мыши, клавиатуры, а потом было начал делать для CBT_ как вспомнил что есть у меня програмка (даже две и обе без исходников) которые ловят появляющиеся окна и без всяких DLL. Програмка первая была написана наверное очень давно, потому что там есть строка by Windows 95. Но несмотря на это работает во всех мною опробованных Виндах. И как же это они делают?
Делать Хук всякое желание отпало. Чую там решение более быстрое (в плане производительности), а то это через Hook мой пойдёт чуть ли не треть всех сообщений. Расскажите кто чё знает. А программку если не верите выслать могу.
Dima_dvp (2003-10-25 01:37:00) [1]
и кстати в SDK вот так
BOOL RegisterShellHookWindow(HWND hWnd);
а второго параметра вроди как нет.
Или я может чего не понимаю, но мне кажеться, что вы (jonni) умны. Это вы хотите сказать, что n это будет тот самый BOOL который должна возвращать ф-ия. Т.е. это значит что при stdcall результат исполнения ф-ии лежит в стеке в самом низу и что нет разницы запросить его как последний параметр или как результат. Я прав или я глуп?
Dima_dvp (2003-10-25 01:22:00) [2]
А к DeregisterShellHookWindow индекс не скажите? или хоть где его узнать....
Dima_dvp (2003-10-25 00:47:00) [3]
Спасибо - понял.
Я по имени пытался достать её, индекса я же не знал. Теперь она есть. Буду пробывать.
Ещё раз спасибо
jonni (2003-10-24 21:36:00) [4]
Dima_dvp (24.10.03 01:48) [13]
to DVM
RegisterShellHookWindow() мне помог.
Но в статье MSDN написано и о DeregisterShellHookWindow(), а в Shell32 её нет. Чё за дела???
jonni © (23.10.03 22:31) [9]
to Dima_dvp
-----------
В точку. Ф-ия именно для этого,но только win2k+
----------
oy ne obmanivay
Procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall; external "shell32.dll" index 181;
vo vseh vindah ona est"
--------------------------------------------------------
kak eto netu????
vot zhe tebe gotoviy primet opisaniya funkcii beri i pol"zuysya..
vse rabotaet na ura i dazhe bez dll
DVM (2003-10-24 17:10:00) [5]
> Эта ф-ия числиться как устаревшая(и не win32 а win32s) и
> поэтому в SDK говориться что она не может быть использована
Она не может устареть, пока ей пользуется Explorer.
Dima_dvp (2003-10-24 04:06:00) [6]
Что -то у меня ничего не получается........
Как всё-таки поймать создание окна вообще хтоь с ДЛЛ, хоть без неё?????
Пытался через HW_SHELL, но только систему повесил пару раз, хотя тот же код, но с HW_MOUSE работает на урура.....
Почитал SDK а там вот что:
Note that custom shell applications do not receive WH_SHELL messages. Therefore, any application that registers itself as the default shell must call the SystemParametersInfo function with SPI_SETMINIMIZEDMETRICS before it (or any other application) can receive WH_SHELL messages.
Причём тут размер свёрнутого окна я так и не понял..... Опечатка или я тупой????
Объясните люди добрые....
PS Прикольнитесь как эту заметру перевёл http://translate.ru
Отметьте, что таможенные заявления снаряда не получают сообщения WH_SHELL. Поэтому, любое заявление, которое регистрирует себя как снаряд по умолчанию, должно назвать функцию SystemParametersInfo с SPI_SETMINIMIZEDMETRICS прежде, чем это (или любое другое заявление) может получить сообщения WH_SHELL.
Dima_dvp (2003-10-24 01:50:00) [7]
Вообще подкиньте кто-нибудь люди добрые что-нибудь что смотреть какие есть в DLL ф-ии.
Заранее благодарен
Dima_dvp (2003-10-24 01:48:00) [8]
to DVM
RegisterShellHookWindow() мне помог.
Но в статье MSDN написано и о DeregisterShellHookWindow(), а в Shell32 её нет. Чё за дела???
Dima_dvp (2003-10-24 00:13:00) [9]
Jonni: спасибо на этом. Я в принципе не против использывать ф-ии, которые в SDK как OLD, но спешить не буду - поищу сначала решение почище.
А в Hook тоже нельзя - он DLL просит - а мне не надо это.
Я вот как DVM сказал попробую
jonni (2003-10-23 23:59:00) [10]
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/registershellhookwindow.asp
eta funkciya est" i v WinXp i v win2003 server...
i vo vseh versiyah do... esli tebya eto ne ustraivaet to tebe odna doroga v HOOK bol"she nikak
Dima_dvp (2003-10-23 22:52:00) [11]
to jonni:
Эта ф-ия числиться как устаревшая(и не win32 а win32s) и поэтому в SDK говориться что она не может быть использована
jonni (2003-10-23 22:31:00) [12]
to Dima_dvp
-----------
В точку. Ф-ия именно для этого,но только win2k+
----------
oy ne obmanivay
Procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall; external "shell32.dll" index 181;
vo vseh vindah ona est"
Dima_dvp (2003-10-23 21:35:00) [13]
to DVM ©:
и инфа действительно скудная, но где наша не пропадала.
Dima_dvp (2003-10-23 21:34:00) [14]
to DVM ©:
В точку. Ф-ия именно для этого,но только win2k+
Dima_dvp (2003-10-23 21:29:00) [15]
Кстати, эта задача навеяна жеданием упаковать всю программку в один файл, но ведь есть ещё одно неэлегантное решение: можно жн сохранить DLL в ресурсах и при первом запуске кинуть её напирмер в system.
Но это подло по отношению к пользователям, которые желают(обычно) иметь полное представление о том, что и где программа сохранила(хотя они всё равно этого не заметят).
Dima_dvp (2003-10-23 21:19:00) [16]
> Vlad Oshin © (23.10.03 10:32) [2]
> просто тот код приведи
>
> > А программку если не верите выслать могу.
>
>
> про хуки на сайте статья была, рекомендую, с примерами
Да уж. Статья была, да ещё к тому же штук 100:)
Но мне-то как раз с хуками всё понятно, мне не понятно чем пользуются эти программы.
> DVM © (23.10.03 18:37) [4]
> RegisterShellHookWindow() тебе поможет.
Я щас посмотрю на MSDN, но в этой программе которая у меня в списке импорта нет такой ф-ии точно
DVM (2003-10-23 18:37:00) [17]
RegisterShellHookWindow() тебе поможет. DLL в данном случае не нужна. Потому как все нужные для работы оболочки хуки уже стоят в shell.dll и shell32.dll. На MSDN есть скудная инфа по этой теме.
NightAngel (2003-10-23 14:55:00) [18]Вот этот код вроде-бы работать не должен, т.к. он пытается поставить локальный хук на поток другого процесса! Т.е. хук срабатывает в удаленом процессе, а хуковая функция находится в этом коде, но... он работает.
#include
HHOOK HookH;
long __stdcall MsgProc(int code,UINT wParam, long lParam)
{
if (code==HC_ACTION)
{
if(((MSG*)lParam)->message==WM_USER+50)
{
MessageBox(0,"Yes!","Thats works",MB_OK);
}
}
return CallNextHookEx(HookH, code, wParam, lParam);
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND HandleOfBrows = FindWindow(NULL, "EFDOK");
DWORD ThreadOfEx = GetWindowThreadProcessId(HandleOfBrows,NULL);
HookH = SetWindowsHookEx(WH_GETMESSAGE,&MsgProc,GetModuleHandle(0),ThreadOfEx);
PostMessage(HandleOfBrows,WM_USER+50,0,0);
Sleep(10);
UnhookWindowsHookEx(HookH);
return 0;
}
Работает он, только если при сборке exe"шника принудительно добавить таблицу релокейшенов, прописав в настройках линкера /FIXED:NO, и собрав релиз версию. Этот трюк срабатывает только в Win9x. Я думаю, работает это потому, что когда срабатывает хук в удаленном процессе, система должна загрузить туда модуль, в котором находится хуковая функция. Т.к. в этом процессе стандартный адрес 400000h (по умолчанию все exe"шники грузятся с этого image base) уже занят, то модулю с хуковой функцией нужно делать настройку адресов. Если это DLL, то релокейшены там есть по умолчанию. Если exe, то их обычно нет - это делается из соображений оптимизации (линкер их обычно "отрезает" - это уменьшает размер exe"шника). Можно заставить этот код работать и в Win2000 - нужно сделать код хуковой функции базонезависимым. Независимость я думаю нужна потому, что при загрузке модуля в другой процесс настройка адресов не производится. Интересно что, для того, чтобы заставить систему загрузить exe в удаленный процесс, нужны релокейшены, а настройка адресов при этом не производится! Что это: баг или фича, я не знаю. Если баг, то тогда должна вызываться точка входа exe"шника в удаленном процессе как если бы это была DllMain, но этого не происходит. Если это фича, то тогда почему не производится настройка адресов? Как это будет работать на других системах я не знаю. Детально разбираться в этом, у меня времени нет, да и практического применения не вижу. Кому интересно, попробуйте проверить на WinNT/XP.
> Вот я тут наткнулся на задачу отловить создание окон(всех окон верхнего уровня всех процессов).
Под Win9x это несложно сделать без всяких хуков. Пробемы будут только с WinNT/2000/XP, хотя и там это решаемо.
Vlad Oshin (2003-10-23 10:32:00) [19]
просто тот код приведи
> А программку если не верите выслать могу.
про хуки на сайте статья была, рекомендую, с примерами
Dima_dvp (2003-10-23 03:41:00) [20]
Или может создатели этих программ на самом деле тупые и сделали SetTimer....
Как бы это проверить, наверняка?
Дизассемблировал. SetTimer есть, но это ещё ничего не значит - там и все GDI ф-ии есть а программа ничего вроде не рисует. Да и доверия у меня компилятору Delphi нет - он чё только не суёт в программы.