![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
wh_shell hook (абочий, но корявый) [D5, Win95/98, WinME, Win2k, WinXP]
stainer © (2002-08-10 02:08:00)И сново здрасте!
Есть вопрос по поводу хука на создание окон.
Вот пример рабочего хука, который передаёт в мою прогу хендл созданного окна
library hook_dll1;
uses Windows, Messages,sysutils;
var
HOOKHANDLE: HHook = 0; Wnd : Hwnd = 0;
function shellproc(Code, W,L : Integer): LongInt; stdcall;
var
i:integer;
begin
if (Code =HSHELL_WINDOWCREATED)// and (w=HSHELL_WINDOWCREATED)) //говорит о том, что создано окно
then begin
i:= FINDWINDOW(NIL,"BLABLA");//HSHELL_WINDOWCREATED; // помоему i всегда = 1
SendMessage(I, WM_USER+111,0 ,w); // Уведомляем программу об этом.
end;
Result := CallNextHookEx(HookHandle, Code, W,L );
end;
function SetHook: LongBool; stdcall;
begin
HookHandle := SetWindowsHookEx(WH_SHELL, shellproc, HInstance, 0);
Result := HookHandle <> 0 ;
end;
function RemoveHook: LongBool; stdcall;
begin
Result := UnHookWindowsHookEx(HookHandle) ;end;
exports
SetHook, RemoveHook; //экспортируемые функции
begin
end.
Но вот в чём проблема:
этот хук реагирует только на окна верхнего уровня (то есть не работает на окна типа open/save dialog)
А мне нужно получить хендл созданного диалога/
Что делать как решить проблему????????????????????????
Спасибо.
Юрий Зотов (2002-08-10 13:33:00) [1]Во-первых, этот хук будет правильно работать только тогда, когда активна установившая его программа. Если же активна любая другая, вызов CallNextHookEx приведет к ошибке (которая может проявляться, а может и нет, но она все равно имеется). По этому поводу советую прочитать статью Алексея Павлова на этом сайте.
Во-вторых, а что же Вы хотели? Хуки WH_SHELL и не должны отлавливать создание диалоговых окон, в справке об этом прямо сказано - "A top-level, unowned window has been created". Видимо, надо ставить хук WH_CALLWNDPROC и ловить WM_CREATE.
@leksey (2002-08-10 11:55:00) [2]Я не знаю, какую конечную цель ты ставишь перед собой??? Но догадываюсь... Давным-давно, когда я только начинал писать проги, тоже хотел знать, когда появится на экране нужное мне окно.. Хук это прикольно... Но я брал активное окно смотрел на его заголовок (Caption) и если это было окно SaveAs я его закрывал... (Хук можешь поставить на активацию окна, все стальные методы притормаживают винду, даже фоновый режим) Вот так было в каменном веке. А вообще я думаю, ты не то ловишь (HSHELL_WINDOWCREATED) Попробуй отловить и записать все сообщение которые приходят при открытии таких окон, а потом проанализируй каждое из них. Удачи.