Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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) Попробуй отловить и записать все сообщение которые приходят при открытии таких окон, а потом проанализируй каждое из них. Удачи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо