Форум: "Система";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];
ВнизGlobal HOOK без DLL.. Это как? Или вообще ни хук? Найти похожие ветки
← →
Dima_dvp (2003-10-23 03:38) [0]Вот я тут наткнулся на задачу отловить создание окон(всех окон верхнего уровня всех процессов). Так вот конечно же первым делом в SDK - а там говорят надо DLL. Ну сделал для теста сначала HOOK для мыши, клавиатуры, а потом было начал делать для CBT_ как вспомнил что есть у меня програмка (даже две и обе без исходников) которые ловят появляющиеся окна и без всяких DLL. Програмка первая была написана наверное очень давно, потому что там есть строка by Windows 95. Но несмотря на это работает во всех мною опробованных Виндах. И как же это они делают?
Делать Хук всякое желание отпало. Чую там решение более быстрое (в плане производительности), а то это через Hook мой пойдёт чуть ли не треть всех сообщений. Расскажите кто чё знает. А программку если не верите выслать могу.
← →
Dima_dvp (2003-10-23 03:41) [1]Или может создатели этих программ на самом деле тупые и сделали SetTimer....
Как бы это проверить, наверняка?
Дизассемблировал. SetTimer есть, но это ещё ничего не значит - там и все GDI ф-ии есть а программа ничего вроде не рисует. Да и доверия у меня компилятору Delphi нет - он чё только не суёт в программы.
← →
Vlad Oshin (2003-10-23 10:32) [2]просто тот код приведи
> А программку если не верите выслать могу.
про хуки на сайте статья была, рекомендую, с примерами
← →
NightAngel (2003-10-23 14:55) [3]Вот этот код вроде-бы работать не должен, т.к. он пытается поставить локальный хук на поток другого процесса! Т.е. хук срабатывает в удаленом процессе, а хуковая функция находится в этом коде, но... он работает.
#include <windows.h>
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, хотя и там это решаемо.
← →
DVM (2003-10-23 18:37) [4]RegisterShellHookWindow() тебе поможет. DLL в данном случае не нужна. Потому как все нужные для работы оболочки хуки уже стоят в shell.dll и shell32.dll. На MSDN есть скудная инфа по этой теме.
← →
Dima_dvp (2003-10-23 21:19) [5]> Vlad Oshin © (23.10.03 10:32) [2]
> просто тот код приведи
>
> > А программку если не верите выслать могу.
>
>
> про хуки на сайте статья была, рекомендую, с примерами
Да уж. Статья была, да ещё к тому же штук 100:)
Но мне-то как раз с хуками всё понятно, мне не понятно чем пользуются эти программы.
> DVM © (23.10.03 18:37) [4]
> RegisterShellHookWindow() тебе поможет.
Я щас посмотрю на MSDN, но в этой программе которая у меня в списке импорта нет такой ф-ии точно
← →
Dima_dvp (2003-10-23 21:29) [6]Кстати, эта задача навеяна жеданием упаковать всю программку в один файл, но ведь есть ещё одно неэлегантное решение: можно жн сохранить DLL в ресурсах и при первом запуске кинуть её напирмер в system.
Но это подло по отношению к пользователям, которые желают(обычно) иметь полное представление о том, что и где программа сохранила(хотя они всё равно этого не заметят).
← →
Dima_dvp (2003-10-23 21:34) [7]to DVM ©:
В точку. Ф-ия именно для этого,но только win2k+
← →
Dima_dvp (2003-10-23 21:35) [8]to DVM ©:
и инфа действительно скудная, но где наша не пропадала.
← →
jonni (2003-10-23 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"
← →
Dima_dvp (2003-10-23 22:52) [10]to jonni:
Эта ф-ия числиться как устаревшая(и не win32 а win32s) и поэтому в SDK говориться что она не может быть использована
← →
jonni (2003-10-23 23:59) [11]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookre ference/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-24 00:13) [12]Jonni: спасибо на этом. Я в принципе не против использывать ф-ии, которые в SDK как OLD, но спешить не буду - поищу сначала решение почище.
А в Hook тоже нельзя - он DLL просит - а мне не надо это.
Я вот как DVM сказал попробую
← →
Dima_dvp (2003-10-24 01:48) [13]to DVM
RegisterShellHookWindow() мне помог.
Но в статье MSDN написано и о DeregisterShellHookWindow(), а в Shell32 её нет. Чё за дела???
← →
Dima_dvp (2003-10-24 01:50) [14]Вообще подкиньте кто-нибудь люди добрые что-нибудь что смотреть какие есть в DLL ф-ии.
Заранее благодарен
← →
Dima_dvp (2003-10-24 04:06) [15]Что -то у меня ничего не получается........
Как всё-таки поймать создание окна вообще хтоь с ДЛЛ, хоть без неё?????
Пытался через 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.
← →
DVM (2003-10-24 17:10) [16]
> Эта ф-ия числиться как устаревшая(и не win32 а win32s) и
> поэтому в SDK говориться что она не может быть использована
Она не может устареть, пока ей пользуется Explorer.
← →
jonni (2003-10-24 21:36) [17]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
← →
Dima_dvp (2003-10-25 00:47) [18]Спасибо - понял.
Я по имени пытался достать её, индекса я же не знал. Теперь она есть. Буду пробывать.
Ещё раз спасибо
← →
Dima_dvp (2003-10-25 01:22) [19]А к DeregisterShellHookWindow индекс не скажите? или хоть где его узнать....
← →
Dima_dvp (2003-10-25 01:37) [20]и кстати в SDK вот так
BOOL RegisterShellHookWindow(HWND hWnd);
а второго параметра вроди как нет.
Или я может чего не понимаю, но мне кажеться, что вы (jonni) умны. Это вы хотите сказать, что n это будет тот самый BOOL который должна возвращать ф-ия. Т.е. это значит что при stdcall результат исполнения ф-ии лежит в стеке в самом низу и что нет разницы запросить его как последний параметр или как результат. Я прав или я глуп?
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.009 c